2009-10-16 169 views
31

我一直在試圖使用SimpleXML,但它似乎不喜歡XML,看起來像這樣:用於解析帶有冒號名稱中的冒號的XML的PHP​​庫?

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div> 

那麼庫將處理這個看起來像標籤(在他們冒號)?

+1

請發表相關的代碼片段。 SimpleXML不應該對命名空間有任何問題。 – 2009-10-16 01:58:42

+0

我也遇到過'SimpleXMLElement($ data)'如果xml數據在標籤中有冒號返回null的相同問題。 – 2012-10-12 19:11:04

回答

64

假設你有一些這樣的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; 
+1

不知道爲什麼這不是選定的答案。但對於將來的任何人來說,這是解決我的問題/問題的人! :) – daveomcd 2011-05-18 16:22:43

7

冒號表示XML名稱空間。 DOM對命名空間有很好的支持。

+0

SimpleXML可能也會這樣,但OP正在尋找一個標籤「xhtml:div」而不是「div」。 – 2009-10-16 00:15:03

+0

SimpleXML有*一些*處理它的東西,但我仍然無法讓它正常工作。 – mpen 2009-10-16 01:44:18

18

如果你要修復它迅速做到這一點(我做的時候,我覺得懶惰)

// 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可能會失敗(還沒有失敗)

+4

這很髒。但很好;) – joedevon 2011-11-23 20:29:34

+0

工程,但它有點哈克..擰我的''標籤的內容,並改變了時間 – supersan 2017-06-22 04:47:17

2

我不認爲這是一個好主意,以擺脫冒號或用別人的建議替換它。您可以輕鬆訪問具有名稱空間前綴的元素。您可以將標識名稱空間的URL作爲參數傳遞給children()方法,也可以將名稱空間前綴和「true」傳遞給children()方法。第二種方法需要PHP 5.2及更高版本。

SimpleXMLElement::children

+0

這不正是納森裏德在我接受的答案中建議的?我同意regex-fu是一個骯髒的黑客攻擊,但不得不通過'children()'選擇器也不是很有趣。 – mpen 2013-02-22 17:06:24

+0

是的,一樣的。我只是想表明,您也可以將標識命名空間的URL傳遞給PHP(以及PHP 5以上)的children()方法。恕我直言,沒有必要做一個骯髒的黑客,當有核心方法可用。 – 2013-02-22 17:22:46