2012-08-13 54 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