我一直在試圖使用SimpleXML,但它似乎不喜歡XML,看起來像這樣:用於解析帶有冒號名稱中的冒號的XML的PHP庫?
<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>
那麼庫將處理這個看起來像標籤(在他們冒號)?
我一直在試圖使用SimpleXML,但它似乎不喜歡XML,看起來像這樣:用於解析帶有冒號名稱中的冒號的XML的PHP庫?
<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>
那麼庫將處理這個看起來像標籤(在他們冒號)?
假設你有一些這樣的xml。
<xhtml:div>
<xhtml:em>italic</xhtml:em>
<date>2010-02-01 06:00</date>
</xhtml:div>
你可以 '時間' 這樣的訪問:但是$xml->children('xhtml', true)->div->em;
,如果你想日期字段,這樣的:$xml->children('xhtml', true)->div->date;
不會工作,因爲你是停留在XHTML命名空間。
你必須執行「孩子」再次回到默認的命名空間:
$xml->children('xhtml', true)->div->children()->date;
不知道爲什麼這不是選定的答案。但對於將來的任何人來說,這是解決我的問題/問題的人! :) – daveomcd 2011-05-18 16:22:43
如果你要修復它迅速做到這一點(我做的時候,我覺得懶惰):
// Will replace : in tags and attributes names with _ allowing easy access
$xml = preg_replace('~(</?|\s)([a-z0-9_]+):~is', '$1$2_', $xml);
這會將<xhtml:
轉換爲<xhtml_
和</xhtml:
至</xhtml_
。 如果涉及到CDATA NameSpaced XML容器塊或UNICODE標籤名稱,但是我會說你通常使用它的安全性,那麼這種hacky可能會失敗(還沒有失敗)。
我不認爲這是一個好主意,以擺脫冒號或用別人的建議替換它。您可以輕鬆訪問具有名稱空間前綴的元素。您可以將標識名稱空間的URL作爲參數傳遞給children()方法,也可以將名稱空間前綴和「true」傳遞給children()方法。第二種方法需要PHP 5.2及更高版本。
這不正是納森裏德在我接受的答案中建議的?我同意regex-fu是一個骯髒的黑客攻擊,但不得不通過'children()'選擇器也不是很有趣。 – mpen 2013-02-22 17:06:24
是的,一樣的。我只是想表明,您也可以將標識命名空間的URL傳遞給PHP(以及PHP 5以上)的children()方法。恕我直言,沒有必要做一個骯髒的黑客,當有核心方法可用。 – 2013-02-22 17:22:46
請發表相關的代碼片段。 SimpleXML不應該對命名空間有任何問題。 – 2009-10-16 01:58:42
我也遇到過'SimpleXMLElement($ data)'如果xml數據在標籤中有冒號返回null的相同問題。 – 2012-10-12 19:11:04