如何使用PHP读取具有三个以上节点级别的XML文件的所有节点?

时间:2016-07-06 03:23:50

标签: php xml

我目前正在编写一个PHP脚本来读取具有三个以上节点级别(深度> 2)的XML文件的所有节点。但是我只能准确地读到一级孩子。

我非常感谢,如果你能让我知道我在尝试阅读二级子节点时所犯的错误。

我的xml文件

<?xml version="1.0" encoding="utf-8"?>
<document nipperstudio="2.3.10.3500" xmlversion="2" xmlrevision="3">
  <report>
    <part index="1" title="Your Report" ref="YOURREPORT">
      <section index="1.1" title="Introduction" ref="INTRODUCTION">
        <text>Inside the section 1.1.:</text>
        <list type="bullet">
          <listitem>detailed description of list item 01;</listitem>
          <listitem>detailed description of list item 02;</listitem>
        </list>
      </section>
      <section index="1.2" title="Report Conventions" ref="REPORTCONVENTIONS">
        <text>This report makes use of the text conventions.</text>
        <table index="3" title="Report text conventions" ref="REPORTTEXTCONVENTIONS">
          <headings>
            <heading>Convention</heading>
            <heading>Description</heading>
          </headings>
        </table>    
      </section>
    </part>
    <part index="2" title="Security Audit" ref="SECURITYAUDIT">
      <section index="2.1" title="Introduction" ref="INTRODUCTION">
        <text>Inside the section 2.1.:</text>
        <list type="bullet">
          <listitem>detailed description of list item 01;</listitem>
          <listitem>detailed description of list item 02;</listitem>
        </list>
        <section index="2.1.1" title="Issue Overview" ref="ISSUEOVERVIEW">
          <text>Inside the section 2.1.1</text>
          <text title="Issue Finding">The is the body text of 2.1.1.</text>
        </section>
        <section index="2.1.2" title="Rating Overview" ref="RATINGSYSTEM">
          <text>Inside the section 2.1.1</text>
          <text title="Issue Finding">The is the body text of 2.1.1.</text>
        </section>
      </section>
      <section index="2.2" title="section title" ref="SECTION2.2">
        <section index="2.2.1" title="Finding" ref="FINDING">
          <text>Inside the section 2.2.1</text>
          <text title="Issue Finding">The is the body text of 2.2.1.</text>
        </section>        
      </section>
    </part>
  </report>
</document>

我的PHP脚本如下所示。

测试XML阅读器

<html>
<title>Test XML Reader</title>
<body>

<p>Output from xmlreader</p>

<?php
readXmlFiles();
?>

</body>
</html>

<?php
function readXmlFiles(){
    // create the reader object
    $reader = new XMLReader();

    // reader the XML file.
    $reader->open("./fwxml/03.xml");    //open the xml file to read.

    while($reader->read()) {
        switch($reader->nodeType) {
            case (XMLREADER::ELEMENT):
                if ($reader->localName == 'report') {   //read the local name of the node
                    $node = $reader->expand();      
                    $dom = new DomDocument();       
                    $n = $dom->importNode($node,true);  
                    $dom->appendChild($n);          

                    foreach(($dom->getElementsByTagName('part')) as $fwpart) {
                        $parttitle = $fwpart->getAttribute('title');

                        echo "=====".$parttitle."=====<br>";

                        foreach(($fwpart->childNodes) as $cnode){   
                            if($cnode->nodeName == 'section'){
                                $index = $cnode->getAttribute('index');
                                $title = $cnode->getAttribute('title');
                                $ref = $cnode->getAttribute('ref');

                                echo "Index = " .$index."<br>";
                                echo "Title = " .$title."<br>";
                                echo "Ref = " .$ref."<br>";                         

                                $fwsec = $dom->getElementsByTagName('section');
                                echo $fwsec->item(0)->nodeValue."<br>";
                                echo "<br><br><br>";

                            }//end of if
                        }//end of foreach

                    }
                }
                break; //end of XMLREADER::ELEMENT

            case (XMLREADER::END_ELEMENT):
                // do something based on when the element closes.
                break;
        }
    }

} //end of function
?>

0 个答案:

没有答案