【问题标题】:SimpleXML load String puting the values into Array() in PHPSimpleXML 加载字符串将值放入 PHP 中的 Array()
【发布时间】:2013-02-09 23:36:15
【问题描述】:

我有一个字符串形式的 XML(在 XLS 转换之后):

<course>
    <topic>
        <chapter>Some value</chapter>
        <title>Some value</title>
        <content>Some value</content>
    </topic>
    <topic>
        <chapter>Some value</chapter>
        <title>Some value</title>
        <content>Some value</content>
    </topic>
    ....
</course>

然后我将上述 XML 推送到 Array() 中:

$new_xml = $proc->transformToXML($xml);

$xml2 = simplexml_load_string($new_xml);
$root = $xml2->xpath("//topic");

$current = 0;
$topics_list = array();

// put the xml values into multidimensional array
foreach($root as $data) {
    if ($data === 'chapter') {
        $topics_list[$current]['chapter'] = $data->chapter;
    }
    if ($data === 'title') {
        $topics_list[$current]['title'] = $data->title;
    }
    if ($data === 'content') {
        $topics_list[$current]['content'] = $data->content;
    }
    $current++;
}
print_r($topics_list);

问题:结果为空数组。我试过 string 像:

$topics_list[$current]['chapter'] = (string) $data->chapter;

但结果仍然是空的。谁能解释一下,我的错误在哪里。谢谢。

【问题讨论】:

    标签: php arrays simplexml


    【解决方案1】:

    因为我的主题元素只有简单的子元素而没有属性,所以我可以将其转换为数组并将其添加到列表中(Demo):

    $xml2 = SimpleXMLElement($new_xml);
    $topics_list = array();
    foreach ($xml2->children() as $data) {
        $topics_list[] = (array) $data;
    }
    

    另一种方法是将get_object_vars映射到主题元素(Demo):

    $topics_list = array_map('get_object_vars', iterator_to_array($xml2->topic, false));
    

    但这可能会变得有点难以阅读/理解。 Foreach 可能更合适。


    这是我的代码的第一个工作版本:

    $xml2 = SimpleXMLElement($new_xml);
    $current = 0;
    $topics_list = array();
    foreach($xml2->children() as $data) {
        $topics_list[$current]['chapter'] = (string) $data->chapter;
        $topics_list[$current]['title'] = (string) $data->title;
        $topics_list[$current]['content'] = (string) $data->content;
        $current++;
    }
    

    再次感谢@Jack、@CoursesWeb 和@fab 的调查。

    【讨论】:

    • 如果您首先创建元素的数组然后添加它,您可以在这里备用$current - 在您的情况下,这甚至不需要任何额外的变量。我在您的答案中添加了一个(半)示例。
    【解决方案2】:

    有几个错误。

    1. xpath() 的返回值

    $root = $xml2->xpath("//topic");
    

    在这里,您将$root 分配给由XPath //topic 检索的所有节点的列表。所以,当你用

    迭代它时
    foreach($root as $data)
    

    $data 指的是每个&lt;topic&gt; 元素,而不是它们的子元素。

    2。 SimpleXMLElements 与字符串的比较

    让我们假设,您循环遍历正确的元素并且$data 引用&lt;chapter&gt; 元素:那么以下表达式为真:

    $data == 'Some value'
    (string) $data === 'Some value'
    

    但是您不能在 SimpleXMLElement 和字符串之间进行类型安全比较 (===),并且转换为字符串不会产生元素名称。你想做的是:

    if ($data->getName() === 'chapter')
    

    3.如何获取文本值

    从上面的解释中应该已经很清楚了,但你也必须替换

    $data->chapter
    

    (string) $data
    

    【讨论】:

      【解决方案3】:

      问题是你没有得到 xml 元素的名称。

      要获取xml元素的名称,请申请elm-&gt;getName()

      在你的代码中应该是:

      if ($data->getName() === 'chapter')
      

      有关使用 Simplexml 遍历和获取 xml 元素的更多详细信息,请参阅本教程:http://coursesweb.net/php-mysql/php-simplexml

      【讨论】:

        猜你喜欢
        • 2018-10-18
        • 2018-07-20
        • 1970-01-01
        • 2013-04-20
        • 2017-11-18
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多