PHP解析XML 元素结构范例

该表率用缩进格式展现三个文书档案中起初成分的构造。 展现 XML
元素构造?php$file = “data.xml”;$depth = array(卡塔尔;function
startElement($parser, $name, $attrsState of Qatar { 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”State of Qatar;
//默许微处理器
    xml_set_external_entity_ref_handler($xml_parser,
“externalEntityRefHandler”State of Qatar;//外界实体指向微处理器
  
    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, $fpState of Qatar; //解释器的操作句柄
和待剖判文件的句柄
}
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卡塔尔(قطر‎State of Qatar卡塔尔{//此处采纳标准赋值。当条件表明式失效时实行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卡塔尔(قطر‎State of Qatar;//首先将整篇文章读入数组,之后再将数组连接成字符串,赋值给$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>

发表评论

电子邮件地址不会被公开。 必填项已用*标注