动态创建的 getElementById XML

getElementById on dynamically created XML

这个例子不言自明,我希望 getElementById 到 return 第二个元素,但给出了 NULL。怎么会?

$dom = new DOMDocument();

$root = $dom->createElement("root");

$el = $dom->createElement("element");
$el->setAttribute("id", "1");
$root->appendChild($el);

$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$root->appendChild($el);

$dom->appendChild($root);

// OK
echo $dom->saveXML();

// NOT OK
var_dump($dom->getElementById("2"));

使用 XML getElementById 方法 returns 元素的某个属性已在 DTD 中定义为具有类型 ID 而不是命名为 id 的元素。所以你需要确保你有一个 DTD 为名为 element 的元素和名为 id 的属性声明类型 ID 如果你想能够使用该方法:

$dom = new DOMDocument();
$dom->loadXML("<!DOCTYPE root [<!ATTLIST element id ID #IMPLIED>]><root/>");

$root = $dom->documentElement;

好像在PHPDOMAPI做

$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$el->setIdAttribute("id", TRUE);

作为 DTD 的替代方法。

如果由 DTD/XSD 或 API 定义,

id 只是一个 id 属性。 XML 中唯一预定义的 id 属性是 xml:id ({http://www.w3.org/XML/1998/namespace}id).

您可以使用 Xpath 通过属性值获取节点。它不需要为此设置 id 属性:

$xml = <<<'XML'
<?xml version="1.0"?>
<root>
  <element id="1"/>
  <element id="2"/>
  <element id="3"/>
</root>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

var_dump(
  $xpath->evaluate('//*[@id=2]')->item(0)->getAttribute('id')
);

输出:

string(1) "2"