2009-11-04 42 views
11

我正在實現XMPP的自制子協議,並且我正在使用StAX和JAXB的組合來解析/編組消息。當我馬歇爾的消息我最終的unneded命名空間聲明載荷:中JAXB將不需要的名稱空間聲明附加到標記

<ns2:auth xmlns:ns2="urn:ietf:params:xml:ns:ilf-auth" 
    xmlns:ns4="ilf:iq:experiment:power" xmlns:ns3="ilf:iq:experiment:init" 
    xmlns:ns5="ilf:iq:experiment:values" xmlns:ns6="ilf:iq:experiment:result" 
    xmlns:ns7="ilf:iq:experiment:stop" xmlns:ns8="ilf:iq:experiment:end"> 
    [email protected]</ns2:auth> 

代替:

<ns:auth xmlns:ns="urn:ietf:params:xml:ns:ilf-auth>[email protected]</ns:auth> 

有沒有辦法把它們的?

所有這些命名空間都用於不同的消息,這些消息被JAXB編組/解組,但每個消息使用一個命名空間。

PS。我不是一個XML專家,請不要咆哮我,如果我做了一個愚蠢的錯誤;)

+0

對於在運輸過程中必須保存的法律文件來說,這是完全不可接受的,以保持其完整性。 JAXB是一種簡單的事情更復雜的方法 – 2010-05-08 15:13:37

+0

JAXB使xml解析/生成方式更容易。我做了一個同時使用JAXB和dom4j(分兩個部分)的項目,差別很大。 – 2010-05-09 11:47:29

回答

10

你正在尋找的功能被要求作爲在issue 103 JAXB問題跟蹤器的增強。由於JAXB作者發現在實際的序列化開始之前再次遍歷對象樹太昂貴,以確定哪些名稱空間實際需要,所以增強性被拒絕了。

雖然相當臃腫,但不必要的名稱空間並不會使XML文檔無效。如果您真的必須節省少量字節並且額外的計算成本可以承受,那麼編寫您自己的XML處理器/過濾器應該很容易,該處理器/過濾器接受JAXB輸出,解析文檔並寫入新文檔而不使用未使用的名稱空間定義。

+2

[XSLT執行此轉換](http://stackoverflow.com/a/4594626/2019259),如果您碰巧使用CXF:http://cxf.apache.org/docs/xslt-feature.html – 2015-07-02 19:26:16

相關問題