2012-06-21 92 views
1

我有一個XML字符串如下:解析XML順序在PHP

<?xml version="1.0" encoding="utf-8"?> 
<document id="0" name="RegSimple" Version="0.1"> 
<Description> 
    Configuration document for simple registration of incidents. 
    This document will contain both the fixed and the user-defined fields to 
    show on the registration screen. 
</Description> 
<Fields> 
    <Textbox id="1" name="IncidentID" visibility="Hidden" width="500" 
     displayreadonly="False" /> 
    <Comment id="200" height="10" name="c1" caption=" " /> 
    <Header id="100" name="Header" caption="Description" /> 
    <Radiobox id="2" name="Type" caption="Feedback type" width="500" 
     type="19" displayreadonly="true"></Radiobox> 
    <Textbox id="3" name="Description" caption="My feedback" 
     width="500" height="75" multiline="True" required="True" 
     displayreadonly="True" /> 
    <Textbox id="4" name="Incident" caption="Title *" width="500" 
     height="25" multiline="False" required="True" displayreadonly="False" /> 
    <Comment id="201" width="500" name="Comment2" 
     caption="* All messages are published with a short title that describes the feedback" 
     multiline="True" height="40" /> 
    <Comment id="202" height="20" name="c1" caption=" " /> 
    <Combobox id="5" name="Unit" caption="Unit" width="500" type="12" 
     required="True" displayreadonly="True"></Combobox> 
    <Combobox id="6" name="Country" caption="Country" width="500" 
     type="11" required="True" displayreadonly="True"></Combobox> 
    <Textbox id="7" name="Office" caption="Office" height="50" 
     width="500" multiline="True" displayreadonly="True" /> 
    <Textbox id="8" name="Cause" caption="Cause" height="50" 
     width="500" multiline="True" displayreadonly="True" /> 
    <Textbox id="9" name="Action" caption="Recommended actions" 
     height="50" width="500" multiline="True" displayreadonly="True" /> 
    <Combobox id="10" name="Theme" caption="Theme" width="500" 
     type="3" required="True" displayreadonly="True"></Combobox> 
    <Header id="102" name="Time" caption="Date, Time and location" /> 
    <Datetime id="11" name="Date" caption="Date" width="120" 
     displayreadonly="True" /> 
    <Textbox id="12" name="Time" caption="Time" width="120" 
     displayreadonly="True" property="True" /> 
    <Textbox id="13" name="Location" caption="Location" width="500" 
     displayreadonly="True" /> 
    <Header id="103" name="info" caption="Contact information" /> 
    <Textbox id="14" name="Name" caption="Name" width="500" tag="user.name" 
     displayreadonly="False" /> 
    <Textbox id="15" name="E-Mail" caption="E-Mail" width="500" 
     tag="user.e-mail" displayreadonly="False" /> 
    <Textbox id="16" name="Registered date" visibility="Hidden" 
     width="500" tag="system.date" displayreadonly="False" /> 
</Fields> 
</document> 

我想在XML中的元素在它們出現在原始字符串的順序來解析順序即。但使用SimpleXMLElementsimplexml_load_string給出相似的元件的陣列如下:

object(SimpleXMLElement)[292] 
    public '@attributes' => 
    array 
     'id' => string '0' (length=1) 
     'name' => string 'RegSimple' (length=9) 
     'Version' => string '0.1' (length=3) 
    public 'Description' => string ' 
    Configuration document for simple registration of incidents. 
    This document will contain both the fixed and the user-defined fields to show on the registration screen. 
    ' (length=178) 
    public 'Fields' => 
    object(SimpleXMLElement)[293] 
     public 'Textbox' => 
     array 
      0 => 
      object(SimpleXMLElement)[294] 
       public '@attributes' => 
       array 
        'id' => string '1' (length=1) 
        'name' => string 'IncidentID' (length=10) 
        'visibility' => string 'Hidden' (length=6) 
        'width' => string '500' (length=3) 
        'displayreadonly' => string 'False' (length=5) 
      1 => 
      object(SimpleXMLElement)[298] 
       public '@attributes' => 
       array 
        'id' => string '3' (length=1) 
        'name' => string 'Description' (length=11) 
        'caption' => string 'My feedback' (length=11) 
        'width' => string '500' (length=3) 
        'height' => string '75' (length=2) 
        'multiline' => string 'True' (length=4) 
        'required' => string 'True' (length=4) 
        'displayreadonly' => string 'True' (length=4) 
      2 => 
      object(SimpleXMLElement)[299] 
       public '@attributes' => 
       array 
        'id' => string '4' (length=1) 
        'name' => string 'Incident' (length=8) 
        'caption' => string 'Title *' (length=7) 
        'width' => string '500' (length=3) 
        'height' => string '25' (length=2) 
        'multiline' => string 'False' (length=5) 
        'required' => string 'True' (length=4) 
        'displayreadonly' => string 'False' (length=5) 
     public 'Comment' => 
     array 
      0 => 
      object(SimpleXMLElement)[295] 
       public '@attributes' => 
       array 
        'id' => string '200' (length=3) 
        'height' => string '10' (length=2) 
        'name' => string 'c1' (length=2) 
        'caption' => string ' ' (length=1) 
      1 => 
      object(SimpleXMLElement)[300] 
       public '@attributes' => 
       array 
        'id' => string '201' (length=3) 
        'width' => string '500' (length=3) 
        'name' => string 'Comment2' (length=8) 
        'caption' => string '* All messages are published with a short title that describes the feedback' (length=75) 
        'multiline' => string 'True' (length=4) 
        'height' => string '40' (length=2) 
      2 => 
      object(SimpleXMLElement)[301] 
       public '@attributes' => 
       array 
        'id' => string '202' (length=3) 
        'height' => string '20' (length=2) 
        'name' => string 'c1' (length=2) 
        'caption' => string ' ' (length=1) 
     public 'Header' => 
     array 
      0 => 
      object(SimpleXMLElement)[296] 
       public '@attributes' => 
       array 
        'id' => string '100' (length=3) 
        'name' => string 'Header' (length=6) 
        'caption' => string 'Description' (length=11) 
      1 => 
      object(SimpleXMLElement)[308] 
       public '@attributes' => 
       array 
        'id' => string '102' (length=3) 
        'name' => string 'Time' (length=4) 
        'caption' => string 'Date, Time and location' (length=23) 
      2 => 
      object(SimpleXMLElement)[312] 
       public '@attributes' => 
       array 
        'id' => string '103' (length=3) 
        'name' => string 'info' (length=4) 
        'caption' => string 'Contact information' (length=19) 
     public 'Radiobox' => 
     object(SimpleXMLElement)[297] 
      public '@attributes' => 
      array 
       'id' => string '2' (length=1) 
       'name' => string 'Type' (length=4) 
       'caption' => string 'Feedback type' (length=13) 
       'width' => string '500' (length=3) 
       'type' => string '19' (length=2) 
       'displayreadonly' => string 'true' (length=4) 
     public 'Combobox' => 
     array 
      0 => 
      object(SimpleXMLElement)[302] 
       public '@attributes' => 
       array 
        'id' => string '5' (length=1) 
        'name' => string 'Unit' (length=4) 
        'caption' => string 'Unit' (length=4) 
        'width' => string '500' (length=3) 
        'type' => string '12' (length=2) 
        'required' => string 'True' (length=4) 
        'displayreadonly' => string 'True' (length=4) 
      1 => 
      object(SimpleXMLElement)[303] 
       public '@attributes' => 
       array 
        'id' => string '6' (length=1) 
        'name' => string 'Country' (length=7) 
        'caption' => string 'Country' (length=7) 
        'width' => string '500' (length=3) 
        'type' => string '11' (length=2) 
        'required' => string 'True' (length=4) 
        'displayreadonly' => string 'True' (length=4) 

在這種結果的所有文本框元件在單個陣列中返回。同樣,所有註釋組合框返回在單獨的數組中,而不考慮原始XML中的順序。

誰能告訴我如何解析元素的實際順序? 謝謝。

回答

2

您可以使用SimpleXmlIteratorRecursiveIteratorIterator遍歷樹:

$tree = new RecursiveIteratorIterator(
    new SimpleXmlIterator($xml), 
    RecursiveIteratorIterator::SELF_FIRST 
); 

foreach ($tree as $node) { 
    echo $node->getName(), PHP_EOL; 
} 

將輸出(demo

Description 
Fields 
Textbox 
Comment 
Header 
Radiobox 
Textbox 
Textbox 
Comment 
Comment 
Combobox 
Combobox 
Textbox 
Textbox 
Textbox 
Combobox 
Header 
Datetime 
Textbox 
Textbox 
Header 
Textbox 
Textbox 
Textbox 
+0

這很好。你能告訴我如何獲取葉節點的屬性嗎? –

+0

@ Arvind07請參閱http://php.net/manual/en/simplexmlelement.attributes.php,http://php.net/manual/en/simplexml.examples-basic.php和http://stackoverflow.com/問題/ 4625045/how-to-access-element-attributes-with-simplexml/4625075#4625075請 – Gordon

+0

感謝您的快速幫助:) –

0

你需要保持遍歷XML元素的樹。每個分支都是另一個simple_xml_element,你可以在foreach中搜索它們。

<?php 

/* For each <character> node, we echo a separate <name>. */ 
foreach ($xml as $element) { 
    $elementName = $element->getName(); 
    $elementAttributes = $element->attributes(); 
    if ($element->children()) { 
     foreach ($element->children() as $subElement) { 
      // etc 
     } 
    } 
} 

?>