大家好嗨读这个:)
我的问题在于$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代码(img
,link
等)
...
<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
()
答案 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"
}