【问题标题】:How to get data from xml (no array)如何从 xml 中获取数据(无数组)
【发布时间】:2023-03-28 05:58:01
【问题描述】:

我有一个 XML 文件和一个 for-each 项目,但我不知道如何获取类别名称和子类别名称,也无法编辑 xml。

这是我的 XML 文件:

<?xml version='1.0' encoding='UTF-8'?>
<data>
  <category name="test-cat1">
    <subcat name="test-subcat1">
      <item name="test-name1">data1</item>
      <item name="test-name2">data2</item>
      <item name="test-name3">data3</item>
    </subcat>
    <subcat name="test-subcat2">
      <item name="test-name4">data4</item>
      <item name="test-name5">data5</item>
      <item name="test-name6">data6</item>
    </subcat>
  </category>
  <category name="test-cat2">
    <subcat name="test-subcat3">
      <item name="test-name7">data7</item>
      <item name="test-name8">data8</item>
      <item name="test-name9">data9</item>
    </subcat>
    <subcat name="test-subcat4">
      <item name="test-name10">data10</item>
      <item name="test-name11">data11</item>
      <item name="test-name12">data12</item>
    </subcat>
  </category>
</data>

这是我的 PHP 脚本:

<?php

 $xml = simplexml_load_file('test.xml');

  foreach($xml->xpath('//item') as $item){

    echo $item . '<br>';
    echo $item['name'] . '<br>';
    echo /*item category*/;
    echo /*item sub-category*/;
    echo "<br>";

  }

?>

我想得到这个结果:

data1
test-name1
test-cat1
test-subcat1

data2
test-name2
test-cat1
test-subcat1

...

【问题讨论】:

标签: php xml foreach


【解决方案1】:

如果您将 XPath 与 $item-&gt;xpath('ancestor::category')[0]['name']$item-&gt;xpath('parent::subcat')[0]['name'] 一起使用,那么您应该获得以下值:

  foreach($data->xpath('//item') as $item){

    echo $item . '<br>';
    echo $item['name'] . '<br>';
    echo $item->xpath('ancestor::category')[0]['name'] . '<br>';
    echo $item->xpath('parent::subcat')[0]['name'] . '<br>';
    echo "<br>";

  }

【讨论】:

    【解决方案2】:

    改为遍历SimpleXMLElement::children()

    <?php
    
    $xml = simplexml_load_file('test.xml');
    
    foreach($xml->children() as $cat){
        $catName = $cat["name"];
        foreach($cat->children() as $subcat){
            $subcatName = $subcat["name"];
            foreach($subcat->children() as $child){
                echo "$child", "\n", $child["name"], "\n", $subcatName, "\n", $catName, "\n\n";
            }
        }
    }
    

    给出这个输出:

    data1
    test-name1
    test-subcat1
    test-cat1
    
    data2
    test-name2
    test-subcat1
    test-cat1
    
    data3
    test-name3
    test-subcat1
    test-cat1
    
    data4
    test-name4
    test-subcat2
    test-cat1
    
    data5
    test-name5
    test-subcat2
    test-cat1
    
    data6
    test-name6
    test-subcat2
    test-cat1
    
    data7
    test-name7
    test-subcat3
    test-cat2
    
    data8
    test-name8
    test-subcat3
    test-cat2
    
    data9
    test-name9
    test-subcat3
    test-cat2
    
    data10
    test-name10
    test-subcat4
    test-cat2
    
    data11
    test-name11
    test-subcat4
    test-cat2
    
    data12
    test-name12
    test-subcat4
    test-cat2
    

    请注意,"$child" 用于将 $child 转换为其字符串内容。这与(string $child)$child-&gt;__toString() 相同。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2016-02-01
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多