2012-09-06 66 views
2

可能重複:
Simplify PHP DOM XML parsing - how?的DOMDocument ::的getElementById返回NULL

這裏是我的XML(c.xml):

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <head> 
     <title id="title">Hello</title> 
    </head> 
</root> 

我做什麼:

$dom = new DOMDocument; 

$dom->load('./c.xml'); 

var_dump($dom->getElementById('title'));die(); // returns NULL 

這裏有什麼問題&?

UPD

$dom->validate();回報DOMDocument::validate(): no DTD found!

+0

你能在你的代碼上運行'$ dom-> validate()'嗎? –

+0

更改'id'到'xml:id' – Gordon

+0

@戈登有沒有使用'id'而不是'xml:id'?也許我應該添加'xml:ns'或根元素? –

回答

8

我覺得The Manual解釋了爲什麼這會發生

對於此功能工作,你需要或者設置與れ一些ID屬性> setIdAttribute()或一個將屬性定義爲類型ID的DTD。在後一種情況下,在使用此函數之前,您需要使用DOMDocument-> validate()或DOMDocument-> validateOnParse驗證文檔。

潛在的修正:

  1. 呼叫$dom->validate();,事後你可以使用$dom->getElementById(),無論錯誤的一些原因。
  2. 使用XPath,如果你不喜歡驗證:

    $x = new DOMXPath($dom);

    $el = $x->query("//*[@id='title']")->item(0); //查找ID =標題中使用自定義的DTD的

例子:

$dtd = '<!ELEMENT note (to,from,heading,body)> 
     <!ELEMENT to (#PCDATA)> 
     <!ELEMENT from (#PCDATA)> 
     <!ELEMENT heading (#PCDATA)> 
     <!ELEMENT body (#PCDATA)>'; 

$systemId = 'data://text/plain;base64,'.base64_encode($dtd); 

$creator = new DOMImplementation; 
$doctype = $creator->createDocumentType($root, null, $systemId); //Based on your DTD from above 
+1

+1,只有'$ dom-> validate()'需要看到一個合適的DTD才能工作。 – Jon

+0

我在DOCS中看到了這個。所以我應該把'DTD'文件附加到我的XML中。怎麼做?有沒有「默認」的DTD? –

+0

查看上面的例子! –

相關問題