用php解析xml时忽略嵌套元素

时间:2011-03-06 19:57:05

标签: php xml

可能是一个简单的问题要回答某人:::

的xml:

   <foobar>
     <foo>i am a foo</foo>
     <bar>i am a bar</bar>
     <foo>i am a <bar>bar</bar></foo>
   </foobar>

在上面,我想显示<foo&gt;的所有元素。当脚本到达嵌套&lt;的行时bar&gt;结果是“我是一个酒吧”..这不是我希望的结果。

是否无法按原样打印出该元素的全部内容,因此我看到:“我是<bar&gt;条</bar&gt;

PHP:

$xml = file_get_contents('sample');
$dom = new DOMDocument;

@$dom->loadHTML($xml);

$resources= $dom->getElementsByTagName('foo');

foreach ($resources as $resource){
        echo $resource->nodeValue . "\n";
}

3 个答案:

答案 0 :(得分:1)

查看类似的问题:

PHP SimpleXML get innerXML

答案 1 :(得分:0)

经过一些拖钓并试图用SimpleXML做我需要的东西后,我得出了以下结论。我对SimpleXML的问题在于元素的位置。如果xml是结构化的,并且层次结构是标准的...我没有问题。

例如,如果XML是一个网页,并且<foo>元素在任何地方,那么SimpleXML没有像getElementsByTagName那样的良好工具来提取元素,无论它在哪里......

<?php
$doc = new DOMDocument();
$doc->load('sample');
$element_name = 'foo';
if ($doc->getElementsByTagName($element_name)->length > 0) {
        $resources = $doc->getElementsByTagName($element_name);

        foreach ($resources as $resource) {
                $id = null;

                if (!$resource->hasAttribute('id')) {
                        $resource->setAttribute('id', gen_uuid());
                }

                $innerHTML = null;
                $children = $resource->childNodes;
                foreach ($children as $child) {
                        $tmp_doc = new DOMDocument();
                        $tmp_doc->appendChild($tmp_doc->importNode($child,true));
                        $innerHTML .= rtrim($tmp_doc->saveHTML());
                }
                $resource->nodevalue = $innerHTML;
        }
} 
echo $doc->saveHTML();
?>

答案 2 :(得分:0)

您可以尝试使用XPath,而不是编写所有代码。该表达式将为“// foo”,它将获取名为“foo”的文档中所有元素的列表。

http://php.net/manual/en/simplexmlelement.xpath.php