簡體   English   中英

動態創建的XML上的getElementById

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM