0

我有一个字符串形式的 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);

问题:结果是空数组。我试过像这样的字符串

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

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

4

3 回答 3

3

因为我的主题元素只有简单的子元素而没有属性,所以我可以将其转换为数组并将其添加到列表中(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 的调查。

于 2013-02-10T20:04:19.327 回答
1

问题是您没有获得 xml 元素的名称。

要获取 xml 元素的名称,请应用elm->getName()

在您的代码中应该是:

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

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

于 2013-02-10T14:49:31.660 回答
1

有几个错误。

1.xpath()的返回值

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

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

foreach($root as $data)

$data 指的是每个<topic>元素,而不是它们的子元素。

2. SimpleXMLElements 与字符串的比较

假设,您遍历正确的元素并$data引用该<chapter>元素:那么以下表达式为真:

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

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

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

3.如何获取文本值

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

$data->chapter

(string) $data
于 2013-02-10T14:53:12.003 回答