DOMDocument :: getElementById返回NULL

s.w*_*dit 2 php dom

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

这是我的XML(c.xml):

<?xml version="1.0" encoding="utf-8"?>
<root>
    <head>
        <title id="title">Hello</title>
    </head>
</root>
Run Code Online (Sandbox Code Playgroud)

我所做的:

$dom = new DOMDocument;

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

var_dump($dom->getElementById('title'));die(); // returns NULL
Run Code Online (Sandbox Code Playgroud)

这里有什么问题&?

UPD

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

Pez*_*kow 9

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

要使此功能起作用,您需要使用DOMElement-> setIdAttribute()或DTD设置一些ID属性,DTD将属性定义为ID类型.在后一种情况下,您需要在使用此函数之前使用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
Run Code Online (Sandbox Code Playgroud)

  • +1,只有`$dom-&gt;validate()` 需要看到合适的DTD 才能工作。 (2认同)