【问题标题】:PHP iterating over an XMLPHP 遍历 XML
【发布时间】:2015-09-21 19:07:00
【问题描述】:

如何将 XML 转换为可以迭代的数组。

这是我的 XML 示例

<user>
    <student>yes</student>
    <id>1</id>
    <name>John</name>
</user>

<user>
    <student>yes</student>
    <id>1</id>
    <name>Billy</name>
</user>

我的 php 是这样的

$tmpTemplates = new XDomDocument();
$tmpTemplates->load('.....myFile.xml');
$xPath = new DomXPath($tmpTemplates);
$query = "//user[student='yes']";
$tmpTemplate = $xPath->query($query);

我想做的是

foreach($tmpTemplate as $tt){
    var_dump($tt->student);
    var_dump($tt->id);
    var_dump($tt->name);
}

现在我只能打印出 nodeValue 这给了我这样的东西:

是的

1

约翰

我怎样才能使它成为一个数组或一个对象,以便我可以通过它的键来apprach每个值?

【问题讨论】:

标签: php xml xpath


【解决方案1】:

您在示例中为两条记录使用了相同的 id,因此我更改了第一个记录的 id 并添加了一个文档元素。

<users>
  <user>
    <student>yes</student>
    <id>2</id>
    <name>John</name>
  </user>
  <user>
    <student>yes</student>
    <id>1</id>
     <name>Billy</name>
  </user>
</users>

使用DOMXpath:evaluate() 获取详细信息,第二个参数是表达式的上下文节点。

$document = new DOMDocument();
$document->loadXml($xmlString);
$xPath = new DomXPath($document);

$students = [];
foreach ($xPath->evaluate("//user[student='yes']") as $student) {
  $id = $xPath->evaluate('string(id)', $student);
  $students[$id] = [
    'id' => $id,
    'name' => $xPath->evaluate('string(name)', $student)
  ];
}

var_dump($students);

输出:

array(2) {
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    string(4) "John"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(5) "Billy"
  }
}

返回值取决于表达式。像//user[student='yes'] 或name 这样的位置路径会返回DOMNodeList。但是您可以直接在 Xpath 中转换节点列表。 string(name) 将返回第一个 name 子节点的内容或空字符串。

【讨论】:

    【解决方案2】:

    我怎样才能使它成为一个数组或一个对象,以便我可以通过它的键来apprach每个值?

    为了澄清起见,到目前为止,您已经有了一个对象,它是 SimpleXMLElement 并且您正在使用 $tt 变量来访问它:

    ...
        var_dump($tt->student);
        var_dump($tt->id);
        var_dump($tt->name);
    ...
    

    现在$tt变量来自另一个变量,即通过迭代它,另一个变量被命名为$tmpTemplate:

    ...
    foreach ($tmpTemplate as $tt) {
        var_dump($tt->student);
        ...
    

    顺便说一句,那个变量是一个数组。因此,您可以使用它通过使用索引(从零开始)来访问每个 &lt;user&gt; 元素,其中包含 document-order 中值为“student”的 &lt;student&gt; 子元素(如你为它制定了xpath):

    • $tmpTemplate[0] 包含第一个用户SimpleXMLElement。
    • $tmpTemplate[1] 包含 第二个 用户 SimpleXMLElement。
    • ...等等等等。

    我希望这能让它更加明显。

    【讨论】:

      【解决方案3】:

      试试this php function

       xml_parse_into_struct
      

      php 手册中的示例

      <?php
        $simple = "<para><note>simple note</note></para>";
        $p = xml_parser_create();
        xml_parse_into_struct($p, $simple, $vals, $index);
        xml_parser_free($p);
        echo "Index array\n";
        print_r($index);
        echo "\nVals array\n";
        print_r($vals);
      ?>
      

      【讨论】:

        【解决方案4】:

        您可以使用simplexml_load_file,将xml转换为对象。

        例如:

        $users = simplexml_load_file("users.xml");
        foreach($users as $user) {
           ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 2023-04-06
          • 2011-10-13
          • 2011-08-23
          • 1970-01-01
          相关资源
          最近更新 更多