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

时间:2015-10-09 09:27:54

标签: php html xml domdocument

大家好嗨读这个:) 我的问题在于$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()

1 个答案:

答案 0 :(得分:2)

这不是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"
}