2016-05-13 12 views
0

この例では、getElementByIdが2番目の要素を返すと予想していますが、NULLが指定されています。どうして? XMLで動的に作成された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

getElementByIdをメソッドは、特定の属性のタイプIDなくid挙げたものを有するものとしてDTDに定義されている要素を返します。だから、あなたがタイプelementという名前の要素のID、あなたはその方法を使用することができるようにしたい場合はidという名前の属性を宣言するDTDを持っていることを確認する必要があります:

$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" 
関連する問題