PHP DOMDocument loadhtml。如何强制不更改标记?

PHP DOMDocument loadhtml. How force not to change markup?

大家好,阅读本文:) 我的问题是 $dom_doc = new DOMDocument("1.0", "utf-8")->loadHTML($doc)

$doc 看起来像:

...
<images>
 <img>
   <file>myfile.jpg</file>
   <desc>My file description</desc>
 </img>
 <img>
   <file>myfile.jpg</file>
   <desc>My file description</desc>
 </img>
</images>
...

loadHTML 将此标签转换为单个 html 标签(imglink 等)

...
<images>
 <img/>
 <file>myfile.jpg</file>
 <desc>My file description</desc>
 <img/>
 <file>myfile.jpg</file>
 <desc>My file description</desc>
</images>
...

我应该怎么做才能强制使用配对标签? 也许 loadXML(),但它不想正确使用 xpath。通过选择器“//images”,显示没有找到任何内容。所以我更喜欢使用 loadHTML()

这不是 HTML 而是 XML,如果您将其加载为 HTML,则 DOM 解析器必须根据 HTML 规则解析它并且这意味着例如 img 没有结束标记。

我希望你有一些命名空间定义 XML。如果是这种情况,您将必须为该命名空间注册一个前缀。

$xml = <<<'XML'
<images xmlns="urn:some-namespace">
 <img>
   <file>myfile.jpg</file>
   <desc>My file description</desc>
 </img>
</images>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('x', 'urn:some-namespace');

foreach ($xpath->evaluate('//x:images/x:img') as $img) {
  var_dump(
    [
      'file' => $xpath->evaluate('string(x:file)', $img),
      'desc' => $xpath->evaluate('string(x:desc)', $img)
    ]
  );
}

输出:

array(2) {
  ["file"]=>
  string(10) "myfile.jpg"
  ["desc"]=>
  string(19) "My file description"
}