我有像这样的xml
<abc:city>
<def:cityname />
<xyz:postalTown>
Sacramento
</xyz:postalTown>
</abc:city>
<abc:city>
<def:cityname />
<pqr:postalTown>
Sacramento
</pqr:postalTown>
</abc:city>
xstream可以在<abc:city>
<pqr:postalTown>
的命名空间也可以更改,因为我不知道响应即将发生。如何通过xstream动态处理。
如果在xstream中这是不可能的;可以使用jaxb处理吗?
编辑: 我的班级将是城市:
Class City{
String cityName;
String postalTown;
}
如何将xml上方映射到 City 类,因为标签包含前缀?
答案 0 :(得分:3)
<强>更新强>
如果前缀与命名空间声明不对应,那么您可以使用我在下面从相关问题链接的答案中的方法:
关于NAMESPACE资格的说明
使用的前缀在对象到XML映射方面没有发挥作用。只要xyz
和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和NAMESPACES
以下是将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和命名空间的一些信息:
DEMO CODE
以下演示代码可用于解组我在本答案前面发布的任何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>