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

使用php解析xml时忽略嵌套元素,php,xml,Php,Xml,也许有一个简单的问题可以回答: xml: 在对SimpleXML进行了一些跟踪和尝试之后,我得出了以下结论。我对SimpleXML的问题是元素在哪里。如果xml是结构化的,并且层次结构是标准的。。。我没有问题 例如,如果XML是一个web页面,并且元素在任何地方,SimpleXML没有像getElementsByTagName这样的好功能来将元素拉到任何地方 <?php $doc = new DOMDocument(); $doc->load('sample'); $element_

也许有一个简单的问题可以回答:

xml:


在对SimpleXML进行了一些跟踪和尝试之后,我得出了以下结论。我对SimpleXML的问题是元素在哪里。如果xml是结构化的,并且层次结构是标准的。。。我没有问题

例如,如果XML是一个web页面,并且
元素在任何地方,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();
?>

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

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

@$dom->loadHTML($xml);

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

foreach ($resources as $resource){
        echo $resource->nodeValue . "\n";
}
<?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();
?>