【问题标题】:Convert XML to Multidimensional Array将 XML 转换为多维数组
【发布时间】:2016-10-03 16:24:22
【问题描述】:

我有这样的 xml 文件:

<?xml version="1.0"?>
<table>
<form>
    <input name="id">1</input>
    <input name="name">Steven Law</input>
    <input name="position">Sales Manager</input>
</form>
<form>
    <input name="id">2</input>
    <input name="name">Martin Wow</input>
    <input name="position">Production</input>
</form>
<form>
    <input name="id">3</input>
    <input name="name">Mike Pan</input>
    <input name="position">Office boy</input>
</form>
</table>

我试图获取元素值。我不知道如何获取每个字段的元素值。到目前为止,我正在尝试这样,它只是获取一个属性值:

<?php
$dom = new DOMDocument();
$dom->load("data.xml");

$input = $dom->getElementsByTagName('input');
foreach($input as $inputs){
  $name= $inputs->getAttribute('name');
  //$value = $field->name('id');
  echo "$name =<br>";
}

输出

id =
name =
position =
id =
name =
position =
id =
name =
position =

我想要的是输出id=1 name=Steven Law ... id=3 name=mike pan position=office boy。之后,我可以从输出到一个数组。

哦,还有一个,请告诉我不同​​的 XMLDOM 和 SimpleXML。我不知道必须选择什么。请帮帮我

【问题讨论】:

    标签: php arrays xml simplexml xmldom


    【解决方案1】:

    读取值可以通过DOMElement::nodeValue:

    <?php
    $dom = new DOMDocument();
    $dom->load("data.xml");
    
    $input = $dom->getElementsByTagName('input');
    foreach($input as $inputs){
      $name= $inputs->getAttribute('name');
    
      $value = $inputs->nodeValue; //reading the value
      echo "$name = $value<br>"; 
    }
    

    通知

    要对此进行测试,必须更正 XML 示例:在第一个块中,&lt;input&gt; 元素以 &lt;/field&gt; 关闭。这必须更改为&lt;/input&gt;

    您要求一个数组。这取决于您在应用程序中需要数据的方式。 这里有两种可能性,应该会给你一个继续前进的想法:

    a) 创建一个数组(简单的方法)

    <?php
    $dom = new DOMDocument();
    $dom->load("data.xml");
    
    $array=array(); //init
    
    $input = $dom->getElementsByTagName('input');
    foreach($input as $inputs){
      $name= $inputs->getAttribute('name');
      $value = $inputs->nodeValue;
    
      //adding a value
      $array[]=array(
        'name' => $name,
        'value' => $value,
        );
    }
    // as an example, just print it
    print_r($array);
    

    你会得到这样的东西:

    Array
    (
        [0] => Array
            (
                [name] => id
                [value] => 1
            )
    
        [1] => Array
            (
                [name] => name
                [value] => Steven Law
            )
    
        [2] => Array
            (
                [name] => position
                [value] => Sales Manager
            )
    
        [3] => Array
            (
                [name] => id
                [value] => 2
            )
    
        [4] => Array
            (
                [name] => name
                [value] => Martin Wow
            )
    
        [5] => Array
            (
                [name] => position
                [value] => Production
            )
    
        [6] => Array
            (
                [name] => id
                [value] => 3
            )
    
        [7] => Array
            (
                [name] => name
                [value] => Mike Pan
            )
    
        [8] => Array
            (
                [name] => position
                [value] => Office boy
            )
    )
    

    b) 创建一个数组(以后用起来更方便)

    <?php
    $dom = new DOMDocument();
    $dom->load("data.xml");
    
    //init
    $array=array();
    //get all form tags
    $forms=$dom->getElementsByTagName('form');
    foreach($forms as $form) {
        //get all input-Tags from this form
        $input = $form->getElementsByTagName('input');
    
        //create an empty element
        $element=array();
        //walk through the input elements of the current form element
        foreach($input as $inputs){
          $name= $inputs->getAttribute('name');
          $value = $inputs->nodeValue;
          //add the data to the element
          $element[$name]=$value;
        }
        //add the element to your array
        $array[]=$element;
    }
    // as an example, just print it
    print_r($array);
    

    在这里,您将首先浏览您的 &lt;form&gt; 元素。然后,在每种形式中,您都阅读了&lt;input&gt; 元素。因此,您将获得包含输入的每个表单块的条目:

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => Steven Law
                [position] => Sales Manager
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => Martin Wow
                [position] => Production
            )
    
        [2] => Array
            (
                [id] => 3
                [name] => Mike Pan
                [position] => Office boy
            )
    
    )
    

    【讨论】:

    • 对不起,我用 field 关闭是我的错误。谢谢,我会尽快尝试
    • 请帮助我。制作一个数组。并告诉我应该使用 dom 或 simplexml。请更新你的答案@akrys
    • simplexml 更容易编码,domxml 更能容忍较小的 XML 错误。这取决于您想使用哪个 API。
    • @akrys 关于容错,您始终可以使用 DOM 的 HTML 解析模式,然后使用 simplexml_import_dom 将对象转换为 SimpleXML(无需任何额外处理 - 它们使用相同的内部表示)。这样您就可以充分利用两者(如果您喜欢 SimpleXML 的简化 API 风格)。
    • 这是一个很好的提示!下一次,我不必重新编写所有代码。谢谢
    【解决方案2】:

    试试 simplehtmldom,它比 xmldom 或 simplexml 更容易使用。您应该能够使用 css 选择器找到您需要的数据。

    【讨论】:

    猜你喜欢
    • 2015-04-04
    • 2021-07-19
    • 2023-03-26
    • 2019-06-29
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多