2012-08-13 66 views
2

我有這樣西河或JAXB模式支持

<abc:city> 
    <def:cityname /> 
    <xyz:postalTown> 
    Sacramento 
    </xyz:postalTown> 
</abc:city> 

<abc:city> 
    <def:cityname /> 
    <pqr:postalTown> 
    Sacramento 
    </pqr:postalTown> 
</abc:city> 

XML可能XSTREAM在<abc:city>

而且處理這些命名空間像「ABC」命名空間<pqr:postalTown>是可以改變的,因爲我不知道未來的響應。這怎麼可以通過xstream動態處理。

如果這在xstream中是不可能的;可以使用jaxb來處理嗎?

編輯: 我的類將是城市:

Class City{ 
String cityName; 
String postalTown; 
} 

如何我上面的XML映射到類作爲標籤包含前綴?

+0

前綴是否與名稱空間聲明相對應,或者您是否有元素名稱,只是恰好在其中包含冒號字符? – 2012-08-13 10:54:18

+1

前綴對應於名稱空間聲明 – 2012-08-13 10:55:33

回答

3

UPDATE

如果前綴不符合命名空間聲明,那麼你可以使用從我從一個相關的問題下面鏈接的答案的方法:


關於NAMESPACE QUA的提示LIFICATION

所使用的前綴在對象到XML的映射方面沒有發揮作用。只要xyzpqr前綴對應於相同的命名空間,對於支持命名空間的任何對象到XML解決方案,您都會很好。

即使以下文檔包含不同的前綴,它們也具有相同的名稱空間限定。

文獻#1

<abc:city xmlns:abc="ABC" xmlns:def="DEF" xmlns:ghi="XYZ"> 
    <def:cityName/> 
    <ghi:postalTown> 
     Sacramento 
    </ghi:postalTown> 
</abc:city> 

文獻2

<jkl:city xmlns:jkl="ABC" xmlns:mno="DEF" xmlns:pqr="XYZ"> 
    <mno:cityName/> 
    <pqr:postalTown> 
     Sacramento 
    </pqr:postalTown> 
</jkl:city> 

JAXB和命名空間

貝洛w是如何將City類映射到上面的XML文檔。請注意,它是名稱空間URI而不是在@XmlRootElement@XmlElement註釋中指定的前綴。

package forum11932402; 

import javax.xml.bind.annotation.*; 

@XmlRootElement(namespace="ABC") 
public class City { 

    @XmlElement(namespace="DEF") 
    String cityName; 

    @XmlElement(namespace="XYZ") 
    String postalTown; 

} 

下面是JAXB和命名空間的一些信息:


演示代碼

以下演示代碼可用於解組我之前在此答案中發佈的任何XML文檔。

package forum11932402; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(City.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11932402/input.xml"); 
     City city = (City) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(city, System.out); 
    } 

} 

以下是運行演示代碼的輸出。 JAXB實現已經分配了新的前綴。 cityName元素仍然是限定名稱空間的,它只對應於聲明爲xmls="DEF"的默認名稱空間。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns3:city xmlns="DEF" xmlns:ns2="XYZ" xmlns:ns3="ABC"> 
    <cityName></cityName> 
    <ns2:postalTown> 
     Sacramento 
    </ns2:postalTown> 
</ns3:city> 
+0

我猜JAXB 2和XStream都可以處理名稱空間。 – 2012-08-13 11:31:45

+0

@PiotrGwiazda - JAXB(JSR-222)的實現絕對可以。 XStream有一些,請參閱「爲什麼XStream沒有任何名稱空間支持?」部分在XStream FAQ中:http://xstream.codehaus.org/faq.html#XML – 2012-08-13 11:39:19

+1

對於XStream,您需要設置Stax驅動程序,而不是默認的DOM驅動程序。不過,我仍然推薦使用JAXB進行XML <-> POJO映射,只要您不需要XStream的特定功能即可。 – 2012-08-13 14:54:32