2016-05-13 62 views
0

該示例說明了一點,我期望getElementById返回第二個元素,但給出NULL。怎麼來的?動態創建的XML上的getElementById

$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")); 

回答

2

隨着XML的的getElementById方法返回該特定屬性已在DTD中被定義爲具有類型ID而不是那些命名id元件。所以,你需要確保你有一個DTD聲明類型ID名爲element的元素,如果你希望能夠使用該方法命名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的替代方案。

+0

你能指出我的工作示例或建議另一種搜索方法給散熱鰭片<元素的id =「2」/>謝謝。 – user1517081

0

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

輸出:

string(1) "2"