Php 动态创建的XML上的getElementById

Php 动态创建的XML上的getElementById,php,xml,domdocument,Php,Xml,Domdocument,这个例子本身就说明了这一点,我希望getElementById返回第二个元素,但给出了NULL。为什么 $dom = new DOMDocument(); $root = $dom->createElement("root"); $el = $dom->createElement("element"); $el->setAttribute("id", "1"); $root->appendChild($el); $el = $dom->createElemen

这个例子本身就说明了这一点,我希望getElementById返回第二个元素,但给出了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方法返回DTD中定义为具有类型
ID
的特定属性的元素,而不是名为
ID
的元素。因此,如果您希望能够使用该方法,则需要确保有一个DTD声明名为
element
的元素的类型
ID
,以及名为
ID
的属性:

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

$root = $dom->documentElement;

作为DTD的替代方法。

对于XML,getElementById方法返回DTD中定义为具有类型
ID
而不是命名为
ID
的特定属性的元素。因此,如果您希望能够使用该方法,则需要确保有一个DTD声明名为
element
的元素的类型
ID
,以及名为
ID
的属性:

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

$root = $dom->documentElement;

作为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')
);

id
仅是由DTD/XSD或API定义的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')
);

你能给我指一个工作示例或建议另一种搜索方法吗?谢谢。你能给我指一个工作示例或建议另一种搜索方法吗。