[英]getElementById on dynamically created XML
该示例说明了一切,我希望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;
看来在PHP DOM API中做
$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
} xml: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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.