PHP解析XML 元素结构范例

该范例用缩进格式显示一个文档中起始元素的结构。 显示 XML
元素结构?php$file = “data.xml”;$depth = array();function
startElement($parser, $name, $attrs) { global $depth; for ($i = 0; $i
$depth[$parser]; $i ) { print ” “; } print “$name”; $depth[$parser]
;}function endElement($parser, $name) { global $depth;
$depth[$parser]–;}$xml_parser =
xml_parser_create();xml_set_element_handler($xml_parser,
“startElement”, “endElement”);if (!($fp = fopen($file, “r”))) {
die(“could not open XML input”);}while ($data = fread($fp, 4096)) { if
(!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf(“XML error:
%s at line %d”, xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}}xml_parser_free($xml_parser);?

以下范例将 XML 文档中的标记符直接映射成 HTML
标记符。在“映射数组”中不存在的元素将被忽略。当然,该范例将只对一个特定的
XML 文档有效。 ?php$file = “data.xml”;$map_array = array( “BOLD” = “B”,
“EMPHASIS” = “I”, “LITERAL” = “TT”);function startElement($parser,
$name, $attrs) { global $map_array; if ($htmltag ==
$map_array[$name]) { print “$htmltag”; }}function endElement($parser,
$name) { global $map_array; if ($htmltag == $map_array[$name]) {
print “/$htmltag”; }}function characterData($parser, $data) { print
$data;}$xml_parser = xml_parser_create();//
使用大小写折叠来保证我们能在元素数组中找到这些元素名称xml_parser_set_option($xml_parser,
XML_OPTION_CASE_FOLDING,
true);xml_set_element_handler($xml_parser, “startElement”,
“endElement”);xml_set_character_data_handler($xml_parser,
“characterData”);if (!($fp = fopen($file, “r”))) { die(“could not open
XML input”);}while ($data = fread($fp, 4096)) { if
(!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf(“XML error:
%s at line %d”, xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}}xml_parser_free($xml_parser);?

XML的精髓是什么呢?

XML的精髓是什么呢?
       
就是我们基于信息描述的、能够体现数据信息之间逻辑关系的、可以确保文件的易读性和易搜索性的自定义标记!
      
你的XML文件遵循所谓“形式良好”要求的种种语法规则,一个完全意义上的XML文件不仅应该是“形式良好的”,而且还应该是使用了这些自定义标记的“有效”的XML文件。

一个XML文件必须遵守文件类型描述DTD(Document Type
Definition)中定义的种种规定。DTD实际上是“元标记”这个概念的产物,它描述了一个标记语言的语法和词汇表,也就是定义了文件的整体结构以及文件的语法。简而言之,DTD规定了一个语法分析器为了解释一个“有效的”XML文件所需要知道的所有规则的细节。

如何写一个XML文件

  1. 第一个行<?xml version=”1.0″ ?>
     2. 必须有一个最外层的标记
     3. XML标记不区分大小写,使用中文都可以, 开始标记是什么,
    结束就必须是什么
     4. 所有的XML标记必须有结束
     5. 所有的属性值必须使用比引号
     6. 层次要清楚
     7. 相同标记不能嵌套
     8. 可以使用实体 & ;
     9. 注释问题
     10. <![CDATA[ ]]>

PHP如何处理XML文件

其实使用php的xml解析函数,处理xml文档无异于处理文件。只要你根据自己的具体需求编写好几个处理函数就万事大吉了。明白了xml文件的读取,那么生成xml文件也就不成问题了。需要注意的问题是注意xml文件的编码和书写规范。
 
下面是手册里的例子,确实是经典的例子,
 

 代码如下

<?php
$file = “xmltest.xml”;
//验证文件的合法性
function trustedFile($file) {
    // only trust local files owned by ourselves
    if (!eregi(“^([a-z]+)://”, $file)
        && fileowner($file) == getmyuid()) {
            return true;
    }
    return false;
}
//处理起始标记的函数。用特殊颜色标记并输出显示。
//注意$attribs为数组
function startElement($parser, $name, $attribs=array() ) {
    print “<<font color=”#0000cc”>$name</font>”;
    if (sizeof($attribs)) {
        while (list($k, $v) = each($attribs)) {
            print ” <font
color=”#009900″>$k</font>=”<font
                   color=”#990000″>$v</font>””;
        }
    }
    print “>”;
}
//结束标记处理并显示
function endElement($parser, $name) {
    print “</<font color=”#0000cc”>$name</font>>”;
}
//处理数据部分
function characterData($parser, $data) {
    print “<b>$data</b>”;
}
//处理指令(PI)处理器 参数处理函数
function PIHandler($parser, $target, $data) {
    switch (strtolower($target)) {
        case “php”:
            global $parser_file;
            // If the parsed document is “trusted”, we say it is safe
            // to execute PHP code inside it.  If not, display the
code
            // instead.
            if (trustedFile($parser_file[$parser])) {
                eval($data);
            } else {
                printf(“Untrusted PHP code: <i>%s</i>”,
                        htmlspecialchars($data));
            }
            break;
    }
}
//默认处理句柄
function defaultHandler($parser, $data) {
    if (substr($data, 0, 1) ==
“&” && substr($data, -1, 1) == “;”)
{//判断数据是否为外部实体,注意这种判断方法。
        printf(‘<font color=”#aa00aa”>%s</font>’,
                htmlspecialchars($data));
    } else {
        printf(‘<font size=”-1″>%s</font>’,
                htmlspecialchars($data));
    }
}
//外部实体处理句柄
function externalEntityRefHandler($parser, $openEntityNames, $base,
$systemId,$publicId) {
    if ($systemId) {
        if (!list($parser, $fp) = new_xml_parser($systemId)) {
            printf(“Could not open entity %s at %sn”,
$openEntityNames,
                   $systemId);
            return false;
        }
        while ($data = fread($fp, 4096)) {
            if (!xml_parse($parser, $data, feof($fp))) {
                printf(“XML error: %s at line %d while parsing entity
%sn”,
                      
xml_error_string(xml_get_error_code($parser)),
                       xml_get_current_line_number($parser),
$openEntityNames);
                xml_parser_free($parser);
                return false;
            }
        }
        xml_parser_free($parser);
        return true;
    }
    return false;
}
//xml分析器。
function new_xml_parser($file) {
    global $parser_file;
    $xml_parser = xml_parser_create(); //建立一个 XML
解析器,此函数返回解释器的操作句柄。
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING,
1); //设置是否采用大小写折叠,及目标编码
    xml_set_element_handler($xml_parser, “startElement”,
“endElement”);//建立起始和终止元素处理器,bool
    xml_set_character_data_handler($xml_parser,
“characterData”);//建立字符数据处理器,bool
    xml_set_processing_instruction_handler($xml_parser,
“PIHandler”);//建立处理指令(PI)处理器
    xml_set_default_handler($xml_parser, “defaultHandler”);
//默认处理器
    xml_set_external_entity_ref_handler($xml_parser,
“externalEntityRefHandler”);//外部实体指向处理器
  
    if (!($fp = @fopen($file,
“r”))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, “array”);//将文件处理变量设为array类型
    }
    $parser_file[$xml_parser] = $file;
//?将文件名赋值给以解释器操作句柄为索引的数组?(解释器的句柄以资源记录的形式返回)
//    echo “<font color=red >parser = “;
//    print_r($parser_file);
//    echo “<br>$xml_parser”;
//    echo “</font>”;
    return array($xml_parser, $fp); //解释器的操作句柄
和待分析文件的句柄
}
if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die(“could not open XML input”);
}
print “<pre>”;
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp)))
{//此处采用条件赋值。当条件表达式失效时执行if处理,否则跳过。
        die(sprintf(“XML error: %s at line %dn”,
                   
xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
print “</pre>”;
print “parse completen”;
xml_parser_free($xml_parser);
?>
 
xmltest.xml文件
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!–因为对xml了解不是很深,故将实体引用部分略去了 –>
<chapter>
 <TITLE>Title </TITLE>
 <para>
  <informaltable>
   <tgroup cols=”3″>
    <tbody>
     <row><entry>a1</entry><entry
morerows=”1″>b1</entry><entry>c1</entry></row>
    
<row><entry>a2</entry><entry>c2</entry></row>
    
<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
 <section id=”about”>
  <title>About this Document</title>
  <para>
   <!– this is a comment –>
   <?php print ‘Hi!  This is PHP version ‘.phpversion(); ?>
  </para>
 </section>
 </chapter>
 
 
还有一个是将xml文件处理成php数组的例子。
<?php
class AminoAcid {
    var $name;  // aa name
    var $symbol;    // three letter symbol
    var $code;  // one letter code
    var $type;  // hydrophobic, charged or neutral
  
    function AminoAcid ($aa) {
        foreach ($aa as
$k=>$v)
            $this->$k = $aa[$k];
    }
}
function readDatabase($filename) {
    // read the xml database of aminoacids
    $data =
implode(“”,file($filename));//首先将整篇文章读入数组,之后再将数组连接成字符串,赋值给$data.
    $parser = xml_parser_create();
   
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);//不使用大小写折叠
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
    xml_parse_into_struct($parser,$data,$values,$tags);//将 XML
数据解析到数组中,该函数将 XML 文件解析到两个对应的数组中,
                //$tags 参数含有指向 $values
数组中对应值的指针。最后两个数组参数可由指针传递给函数。
    xml_parser_free($parser);
    // loop through the structures
   
//针对具体的应用(不同的xml文件,修改此处循环结构得到具体的数组即可。
    foreach ($tags as $key=>$val) {
        if ($key == “molecule”) {
            $molranges = $val;
            // each contiguous pair of array entries are the
            // lower and upper range for each molecule definition
            for ($i=0; $i < count($molranges); $i+=2) {
                    $offset = $molranges[$i] + 1;
                $len = $molranges[$i + 1] – $offset;
                $tdb[] = parseMol(array_slice($values, $offset,
$len));
            }
        } else {
            continue;
        }
    }
//    echo “<font color=red>values is:”;
//    print_r($values);
//    echo “</font>”;
    return array($tdb,$values);
}
function parseMol($mvalues) {
    for ($i=0; $i < count($mvalues); $i++)
        $mol[$mvalues[$i][“tag”]] = $mvalues[$i][“value”];
      
//    echo “<font color=blue> after parsemol :”;
//    print_r($mol);
//    echo “</font>”;
    return new AminoAcid($mol);
}
$db = readDatabase(“moldb.xml”);
echo “** Database of AminoAcid objects:n”;
   // echo “<font color=purple> readdatabase :”;
    print_r($db[0]);
   // echo “</font>”;

$s = parseMol($db[1]);
?>
 
副 moldb.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<moldb>
    <molecule>
        <name>Alanine</name>
        <symbol>ala</symbol>
        <code>A</code>
        <type>hydrophobic</type>
    </molecule>
    <molecule>
        <name>Lysine</name>
        <symbol>lys</symbol>
        <code>K</code>
        <type>charged</type>
    </molecule>
</moldb>

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图