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

问题描述 投票:0回答:6

如何使用下面的代码来解组 XML 字符串并将其映射到下面的 JAXB 对象?

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");

@XmlRootElement(name = "Person")
public class Person {
    @XmlElement(name = "First-Name")
    String firstName;
    @XmlElement(name = "Last-Name")
    String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
java xml jaxb
6个回答
328
投票

要传递 XML 内容,您需要将内容包装在

Reader
中,然后将其解组:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("xml string here");
Person person = (Person) unmarshaller.unmarshal(reader);

179
投票

或者如果你想要简单的一句:

Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);

21
投票

没有

unmarshal(String)
方法。你应该使用
Reader
:

Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));

但通常您是从某个地方获取该字符串,例如文件。如果是这样的话,最好通过

FileReader
本身。


4
投票

如果你已经有了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 "";
}

1
投票
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;
    }

0
投票

我无法评论现有答案,因此我必须写一个新答案。 现有的答案没有考虑 XML 标签包含小写和大写字母的情况。我学到了在这种情况下你必须使用的反复试验

@XmlElement(name="ActualAttriubuteName")

这是一个例子

<?xml version='1.0' encoding='utf-8'?><Terminal><TermInfo><IDM>1</IDM></TermInfo></Terminal>

对应的bean是:

@XmlRootElement(name="Terminal")
public class Terminal implements Serializable{

private static final long serialVersionUID = -5541959943076783942L;

private TermInfo termInfo = null;


@Override
public String toString() {
    return "Terminfo [termInfo=" +termInfo.toString() + "]";
}   


@XmlElement(name="TermInfo")
public TermInfo getTermInfo() {
    return termInfo;
}


public void setTermInfo(TermInfo termInfo) {
    this.termInfo = termInfo;
}
   }

import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
public class TermInfo implements Serializable{

private static final long serialVersionUID = 6829846773317527647L;

private Integer idm = null;
    
@Override
public String toString() {
    return "id=" +idm + "]";
}   

@XmlElement(name="IDM")
public Integer getIdm() {
    return idm;
}

public void setIdm(Integer idm) {
    this.idm = idm;
} 
}

解组代码是

        xml = "<?xml version='1.0' encoding='utf-8'?><Terminal><TermInfo><IDM>1</IDM></TermInfo></Terminal>";
    
    
      StringReader sr = new StringReader(xml);
     
      JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance(Terminal.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        Terminal termInfo= (Terminal) unmarshaller.unmarshal(sr);    

        System.out.println(termInfo.toString());
        
        
        
        
        
    } catch (JAXBException e) { 
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
© www.soinside.com 2019 - 2024. All rights reserved.