在 PHP 中按顺序解析 XML [英] Parse XML sequentially in PHP

查看:27
本文介绍了在 PHP 中按顺序解析 XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 XML 字符串,如下所示:

I have an XML string as follows:

<?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 会给出类似元素的数组,如下所示:

I want the elements in the XML to be parsed sequentially i.e in the order they appear in the original string. But using SimpleXMLElement and simplexml_load_string give arrays of similar elements as following:

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)

在此结果中,所有 Textbox 元素都在单个数组中返回.同样,所有评论组合框都在单独的数组中返回,而不管原始 XML 中的顺序如何.

In this result all the Textbox elements are returned in a single array. Similarly all comments and Comboboxes are returned in separate arrays irrespective of there order in the original XML.

谁能告诉我如何按实际顺序解析元素?谢谢.

Can anyone tell me how to parse the elements in their actual order? Thanks.

推荐答案

您可以使用 SimpleXmlIteratorRecursiveIteratorIterator 遍历树:

You can use SimpleXmlIterator and RecursiveIteratorIterator to traverse the tree:

$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

这篇关于在 PHP 中按顺序解析 XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆