我有以下xml字符串。我想将其转换为java对象,以使用该对象的字段映射每个标记。如果我可以引入与标记名称相比的不同字段名称,那就更好了。我怎么能这样做?我正在寻找JAXB,但我仍然对“ns4:response”和标签内的标签等部分感到困惑。提前谢谢你......
<ns4:response>
<count>1</count>
<limit>1</limit>
<offset>1</offset>
<ns3:payload xsi:type="productsPayload">
<products>
<product>
<avgRating xsi:nil="true"/>
<brand>Candie's</brand>
<description>
<longDescription>
long descriptions
</longDescription>
<shortDescription>
short description
</shortDescription>
</description>
<images>
<image>
<altText>alternate text</altText>
<height>180.0</height>
<url>
url
</url>
<width>180.0</width>
</image>
</images>
<price>
<clearancePrice xsi:nil="true"/>
<regularPrice xsi:nil="true"/>
<salePrice>28.0</salePrice>
</price>
</product>
</products>
</ns3:payload>
</ns4:response>
答案 0 :(得分:19)
JAXB是用于将对象转换为XML或从XML转换对象的Java标准(JSR-222)。以下内容应该有所帮助:
从字符串解组
在JAXB impl可以解组之前,您需要将String
包装在StringReader
的实例中。
StringReader sr = new StringReader(xmlString);
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Response response = (Response) unmarshaller.unmarshal(sr);
不同的字段和XML名称
您可以使用@XmlElement
注释来指定您想要元素名称的内容。默认情况下,JAXB会查看属性。如果您希望将字母映射到字段上,则需要设置@XmlAccessorType(XmlAccessType.FIELD)
。
@XmlElement(name="count")
private int size;
<强>命名空间强>
@XmlRootElement
和@XmlElement
注释还允许您在需要时指定命名空间限定。
@XmlRootElement(namespace="http://www.example.com")
public class Response {
}
了解更多信息
答案 1 :(得分:2)
JAXB是一个很好的镜头。如果您有本文档的XSD文件,这将非常简单。 JAXB可以为指定的模式生成Java代码。
如果您没有XSD文件,则需要自己准备Java类。查找JAXB教程并查看文档http://jaxb.java.net/tutorial/。
标签中的标签只是JAXB的嵌套对象。 ns4
是名称空间。 JAXB支持名称空间 - 只需在文档中查找即可。您可以使用注释在XML中引入与标记不同的字段名称。 Follwo文档。
答案 2 :(得分:1)
如果你有上面显示的XML的XSD 我建议你使用Jaxb JAXB从XML文件创建java对象。 您需要首先使用jaxb的代码生成器生成Java类,该代码生成器将XSD作为输入,然后适当地序列化/反序列化这些xml文件。
答案 3 :(得分:0)
如果您已经拥有xml,并且有多个属性,则可以按如下方式处理:
String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
<nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
<nomCiudad>Pereira</nomCiudad></ciudads>";
DocumentBuilder db = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(output));
Document doc = db.parse(is);
NodeList nodes = ((org.w3c.dom.Document) doc)
.getElementsByTagName("ciudad");
for (int i = 0; i < nodes.getLength(); i++) {
Ciudad ciudad = new Ciudad();
Element element = (Element) nodes.item(i);
NodeList name = element.getElementsByTagName("idCiudad");
Element element2 = (Element) name.item(0);
ciudad.setIdCiudad(Integer
.valueOf(getCharacterDataFromElement(element2)));
NodeList title = element.getElementsByTagName("nomCiudad");
element2 = (Element) title.item(0);
ciudad.setNombre(getCharacterDataFromElement(element2));
ciudades.getPartnerAccount().add(ciudad);
}
}
for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
System.out.println(ciudad1.getIdCiudad());
System.out.println(ciudad1.getNombre());
}
方法getCharacterDataFromElement是
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}