2

可能重复:
简化 PHP DOM XML 解析 - 如何?

这是我的 XML (c.xml):

<?xml version="1.0" encoding="utf-8"?>
<root>
    <head>
        <title id="title">Hello</title>
    </head>
</root>

我做什么:

$dom = new DOMDocument;

$dom->load('./c.xml');

var_dump($dom->getElementById('title'));die(); // returns NULL

这里有什么问题&?

UPD

$dom->validate();返回DOMDocument::validate(): no DTD found!

4

1 回答 1

11

我认为手册解释了为什么会发生这种情况

要使此函数起作用,您将需要使用 DOMElement->setIdAttribute() 设置一些 ID 属性或将属性定义为 ID 类型的 DTD。在后一种情况下,您需要在使用此函数之前使用 DOMDocument->validate() 或 DOMDocument->validateOnParse 验证您的文档。

潜在的修复:

  1. 调用$dom->validate();,之后您可以使用$dom->getElementById(),无论由于某种原因出现错误。
  2. 如果您不想验证,请使用 XPath:

    $x = new DOMXPath($dom);

    $el = $x->query("//*[@id='title']")->item(0);//查找id=title

使用自定义 DTD 的示例:

$dtd = '<!ELEMENT note (to,from,heading,body)>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT from (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>';

$systemId = 'data://text/plain;base64,'.base64_encode($dtd);

$creator = new DOMImplementation;
$doctype = $creator->createDocumentType($root, null, $systemId); //Based on your DTD from above
于 2012-09-06T11:18:43.930 回答