1

私は次のようなXML文字列を持っています:

<?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内の要素を順番に、つまり元の文字列に表示される順序で解析する必要があります。ただし、次のように同様の要素の配列を使用SimpleXMLElementして指定します。simplexml_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の順序に関係なく、別々の配列で返されます。

誰かが実際の順序で要素を解析する方法を教えてもらえますか?ありがとう。

4

2 に答える 2

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
于 2012-06-21T11:42:30.280 に答える
0

XML 要素のツリーを走査し続ける必要があります。各ブランチは別の simple_xml_element であり、foreach llops でそれらを掘り下げます。

<?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
        }
    }
}

?> 
于 2012-06-21T11:43:09.433 に答える