Java 使用JAXB从XML字符串创建对象
如何使用下面的代码来解组XML字符串并将其映射到下面的JAXB对象Java 使用JAXB从XML字符串创建对象,java,xml,jaxb,Java,Xml,Jaxb,如何使用下面的代码来解组XML字符串并将其映射到下面的JAXB对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Person person = (Person) unmarshaller.unmarshal("xml string here"); 要传递XML内容,您需要将内容包装在读
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");
要传递XML内容,您需要将内容包装在
读取器中,并反汇编:
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader("xml string here");
Person person = (Person) unmarshaller.unmarshal(reader);
没有解组(字符串)
方法。您应该使用读卡器
:
Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));
但通常情况下,您是从某个地方获取该字符串的,例如文件。如果是这种情况,最好传递文件读取器本身。或者如果您想要一个简单的单行程序:
Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);
Person-Person=JAXB.unmarshal(新的StringReader(“如果您已经拥有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());
}
如果“这里的xml字符串”包含一个SOAP信封,您能扩展这个答案吗?如果您想将读取器
与特定的bean类结合使用怎么办?因为没有解组器(读取器,类)
方法。例如,有没有办法将读取器
转换为javax.xml.transform.Source
?在我的例子中,我的工作是:JAXBElement elemento=(JAXBElement)unmarshaller.unmarshal(Reader);MyObject=elemento.getValue();
@bvdb您可以使用javax.xml.transform.stream.StreamSource
,它的构造函数可以使用Reader
、File
或InputStream
。谢谢!在我的例子中,我需要做一些不同的事情:Person-Person=(Person)((JAXBElement)unmarshaller.unmarshal(Reader)).getValue();这应该是可接受的答案。这不太复杂。非常简单。我完全同意,这一定是可接受的答案。我实际上不同意上面的评论。这当然更容易,但它会动态创建上下文,因此即使上下文最终被缓存,也会对性能产生影响。请谨慎使用。那么有什么替代方法如果我们想为解组器提供一个类?唯一的方法是在参数中使用一个(节点,类),这里我们有一个字符串。在这个简洁的版本中,我没有收到解析错误,这对调试配置很有用。可能我缺少一些东西。。。
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());
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
If you want to parse using InputStreams
public Object xmlToObject(String xmlDataString) {
Object converted = null;
try {
JAXBContext jc = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
InputStream stream = new ByteArrayInputStream(xmlDataString.getBytes(StandardCharsets.UTF_8));
converted = unmarshaller.unmarshal(stream);
} catch (JAXBException e) {
e.printStackTrace();
}
return converted;
}