【问题标题】:Use JAXB to create Object from XML String使用 JAXB 从 XML 字符串创建对象
【发布时间】:2011-07-24 10:47:36
【问题描述】:

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


    【解决方案1】:

    要传递 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);
    

    【讨论】:

    • 如果“此处的 xml 字符串”包含 SOAP 信封,您能否扩展此答案以包括在内?
    • 如果您想将Reader 与特定的bean 类结合使用怎么办?由于没有unmarshall(Reader, Class) 方法。例如。有没有办法将 Reader 转换为 javax.xml.transform.Source
    • 在我的情况下工作为:JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
    • @bvdb 您可以使用javax.xml.transform.stream.StreamSource,它的构造函数采用ReaderFileInputStream
    • 谢谢!就我而言,我需要做一些不同的事情:Person person = (Person) ((JAXBElement) unmarshaller.unmarshal(reader)).getValue();
    【解决方案2】:

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

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

    【讨论】:

    • 这应该是公认的答案。这不那么复杂。
    • 非常简单。我完全同意,它必须是公认的答案。
    • 我实际上不同意上面的 cmets。这当然更容易,但它会动态创建上下文,因此即使上下文最终被缓存,它也会对性能产生影响。谨慎使用。
    • 如果我们想为 unmarshaller 提供一个类,还有什么选择呢?唯一的方法在参数中接受一个(节点,类),这里我们有一个字符串。
    • 有了这个简洁的版本,我不会收到解析错误,这对于调试配置很有用。可能我错过了什么......
    【解决方案3】:

    没有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 "";
      }
      

      【讨论】:

        【解决方案5】:
        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;
            }
        

        【讨论】:

          猜你喜欢
          • 2012-10-28
          • 2013-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-26
          • 1970-01-01
          • 2015-09-08
          相关资源
          最近更新 更多