Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAXB从XML字符串创建对象_Java_Xml_Jaxb - Fatal编程技术网

Java 使用JAXB从XML字符串创建对象

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内容,您需要将内容包装在读

如何使用下面的代码来解组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();

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;
    }