更新
如果前缀与命名空间声明不对应,那么您可以使用我在下面从相关问题链接的答案中的方法:
关于命名空间资格的说明
所使用的前缀在对象到 XML 的映射中不起作用。只要 thexyz
和pqr
前缀对应于相同的命名空间,您就可以使用任何支持命名空间的对象到 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 和命名空间
下面是如何将您的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>