2012-11-16 72 views
0

我有一條XML消息,我嘗試使用GXT和AutoBeans進行分析。我的XML的根節點有一個名稱空間聲明,看起來AutoBean解析器不能讀取XML。當根節點有一個名稱空間聲明時,GXT和AutoBeans可以處理XML嗎?

我成立了AutoBean對象圖的根與屬性名規格:

@PropertyName("record") 
RecordObject getRecord(); 

但是,當我的XML看起來是這樣的:

<record xmlnms:ab="http://anynamespace.com"> 
<ab:name>SampleName</ab:name> 
<ab:email>[email protected]</ab:email> 
</record> 

的AutoBean似乎無法解碼XML。如果名稱空間聲明不存在,則AutoBean可以找到根記錄對象。有一些其他的參數或我可以指定告訴AutoBean僅查看元素名稱的內容嗎?

我已經試過

我試圖解析與命名空間中剝離出來和它的作品,但我的實際使用情況下,我不能刪除命名空間聲明。我也嘗試在@PropertyName屬性中指定名稱空間 - @PropertyName("record xmlnms:ab=\"http://anynamespace.com\"") - 但這不起作用(我也沒有期望它)。

編輯

我使用GXT的XmlReader中,試圖解析XML。

+0

你是如何將xml解析爲AutoBeans的?最後我看了,GWT只支持JSON <-> AutoBeans。 GXT有一個XmlReader,它使用定製的Splittable實現來處理XML - 這就是你正在使用的?或者有另一種方法來連接它嗎? –

+0

是的,我應該更具體,並犯了一個錯字 - 我的意思是GXT。我正在嘗試使用XmlReader。編輯帖子... –

+0

偉大的 - 嘗試在答覆傳入... –

回答

1

GXT的XmlReader位於瀏覽器中存在的XML解析器中。它使用GWT中的com.google.gwt.xml.XML模塊來獲得對所有瀏覽器中XML節點的相對一致的訪問,而不是構建自己的XML解析器。通過在瀏覽器中使用內置實現,GXT可以訪問本地解析器 - 事實證明,瀏覽器非常擅長解析XML,因爲這是他們整天都在做的,加載了網頁。

然後,GXT有自己的查詢引擎來查找節點,查詢語言使用XPath和CSS3的組合。這種組合可以很好地用於查找html本身的節點,以及在xml文檔中查找節點。然而,瀏覽器對命名空間的支持不一致(我在看你,IE),所以GWT中的XML模塊不知道如何談論命名空間,而DomQuery引擎也不是真的。另外,在XML中意爲「命名空間」的:運算符被用來表示CSS中的'psuedo-selector',所以如果直接支持它,查詢語言會有點模糊:字符串foo:bar可能意味着「所有元素名稱foo「與匹配選擇器bar」匹配,或「名稱空間foo中名稱爲bar的所有元素」。

這樣的問題足夠了:什麼是解決方案?目前,對於IE6/IE7/IE8中的名稱空間元素沒有一個好的選擇 - 瀏覽器中的一部分不一致以及GXT中一部分缺乏醜陋的解決方法意味着您無法直接讀出元素。對於所有其他瀏覽器,要選擇像namespace:eltname這樣的元素,只需使用@PropertyName("eltname")即可。其他

一個注意:由於這樣的事實屬性不具有僞選擇器,你可以選擇他們 - @PropertyName("namespace:attrname")將正確<element namespace:attrname="value">讀出值的屬性。

+0

謝謝 - 我認爲這是答案的大部分,但XmlReader不能專門讀取根節點。因此,如果根包含名稱空間的聲明,那麼XmlReader根本無法解析XML。根據你的回答,我想這可能是由於GXT查詢引擎的實現?我沒有試圖獲得名稱空間聲明中的值,而是解析整個XML消息。看起來XmlReader並不認爲有有效的XML可以解析,除非根節點只是一個元素(例如 ...)。 –

+0

這個問題的根源在於,IE沒有getElementsByTagNameNS函數,再加上':'操作符在DomQuery語法中已經有含義,這與命名空間的使用不兼容。讀命名空間的元素沒有問題 - 這些元素像未使用的屬性 - 但是在IE中讀取'ab:email' /'ab:name'子標籤。如果DomQuery不支持僞選擇符(':first',':even',':not(...)'等),它可以匹配命名空間。其他選擇,正如我在論壇帖子中所述,強制xml解析看起來更像CSS,或者是一個新的查詢impl。 –

相關問題