简体   繁体   English

以有效的方式将 XML 解析为 JAVA POJO

[英]Parse XML TO JAVA POJO in efficient way

How to parse and create java pojo for below xml in an efficient way?如何以有效的方式为下面的xml解析和创建java pojo? Kindly suggest any efficient parser.请建议任何有效的解析器。

XML format is XML 格式是

<?xml version="1.0" encoding="utf-8"?>
<CCMainRootTag ID="12">
  <Header TableName="TableName"    TableVersion="12" TableID="12" CreatedDate="2013-02-09T15:35:33" CreatedByUserName="ABC" CreatedBySystem="ABC" />
  <ClassPrimary ID="12" Code="Y" DescriptionDK="DK language " DescriptionUK="" DefDK="" DefUK="" IFDGUID="">
    <ObjectClass ID="12" Code="YA" DescriptionDK="DK Language" DescriptionUK="" DefDK=""     DefUK="" IFDGUID="">
      <Synonym>
        <Concept Description="Description" Language="DK" />
        <Concept Description="" Language="UK" />
        <Concept Description="Description" Language="DK" />
        <Concept Description="" Language="UK" />
        <Concept Description="Description" Language="DK" />
        <Concept Description="" Language="UK" />
        <Concept Description="Description" Language="DK" />
        <Concept Description="" Language="UK" />
      </Synonym>
    </ObjectClass>
    <ObjectClass ID="12" Code="YB" DescriptionDK="DK Language" DescriptionUK="" DefDK="" DefUK="" IFDGUID=""> </ObjectClass>
    <ObjectClass ID="12" Code="YC" DescriptionDK="DK Language" DescriptionUK="" DefDK="" DefUK="" IFDGUID=""> </ObjectClass>
    <ObjectClass ID="12" Code="YD" DescriptionDK="DK language" DescriptionUK="" DefDK="" DefUK="" IFDGUID=""> </ObjectClass>
  </ClassPrimary>
</CCMainRootTag>

I already use this Link but it have slow performance and having problem did't valid pojo.我已经使用了这个链接,但它的性能很慢,并且有问题没有有效的 pojo。

I want to parser which provide me direct java pojo in a efficient way.我想解析它以有效的方式为我提供直接的 java pojo。

You can use JAXB to convert XML into Java POJOs.您可以使用JAXB将 XML 转换为 Java POJO。 But before you finalize the solution check this site for performance comparison.但是在您最终确定解决方案之前,请检查此站点以进行性能比较。

For those looking for JAXB code to convert xml to java object:对于那些正在寻找将 xml 转换为 java 对象的 JAXB 代码的人:

//Convert xml to String first
Element partyLoaderRequest; // your xml data
String xmlString = new XMLOutputter().outputString(partyLoaderRequest);   
InputStream is = new ByteArrayInputStream(xmlString.getBytes());
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = docBuilder.parse(is);
org.w3c.dom.Element varElement = document.getDocumentElement();
JAXBContext context = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement<Person> loader = unmarshaller.unmarshal(varElement, Person.class);
Person inputFromXml = loader.getValue();

whereas Person has proper XML annotations:而 Person 有适当的 XML 注释:

@XmlRootElement(name="Person")
public class CimbWlAdminUserAmendInput {
    @XmlElement(name="companyName",required=true,nillable=false) 
    private String companyName;
    ...
    //setters getters
    @XmlTransient
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
}

Serialization and Deserialization can be handle by JacksonXmlModule. JacksonXmlModule 可以处理序列化和反序列化。

// Item.class - use lombok or create g/setters
@JsonPropertyOrder({"name", "description", "note"})
public class Item { 
   private String name;
   private String description;
   private String note;
}


// Test.class
package hello.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import hello.entity.Item;
import org.junit.Before;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

public class NameServiceImplTest {

    ObjectMapper objectMapper;

    @Before
    public void setup() {
        JacksonXmlModule xmlModule = new JacksonXmlModule();
        xmlModule.setDefaultUseWrapper(false);
        this.objectMapper = new XmlMapper(xmlModule);
        this.objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    }

    @Test
    public void serializeTest() {

        // Wrapper
        @JacksonXmlRootElement(localName = "names")
        class Names {
            public List<Item> item = new ArrayList<>();
        }

        Item item = new Item();
        item.setName("Vladimir");
        item.setDescription("Desc");
        item.setNote("Note");

        Item item2 = new Item();
        item2.setName("Iva");
        item2.setDescription("Desc2");
        item2.setNote("Note2");

        Names names = new Names();
        names.item.add(item);
        names.item.add(item2);

        try {
            String xml = objectMapper.writeValueAsString(names);
            assertNotNull(xml);
            System.out.println(xml);
        } catch (Exception e) { // IOException
            System.out.println(e.getMessage());
            fail();
        }
    }

    @Test
    public void deserializeTest() {
        String xml = "<names>" +
                "<item><name>name</name><description>desc</description><note>note</note></item>" +
                "<item><name>name</name><description>desc</description><note>note</note></item>" +
                "</names>";

        try {
            List<Item> names = objectMapper.readValue(xml, new TypeReference<List<Item>>() {});
            names.forEach(item -> {

                assertEquals("name", item.getName());
                assertEquals("desc", item.getDescription());
                assertEquals("note", item.getNote());

            } );
        } catch (Exception e) { // IOException

        }


    }
}
public class XmlConvertUtil {

    public static void main(String[] args) {
        ResultDataSet resultDataSet = new ResultDataSet(new DtInformation("0", "Success"), new DtData("980000001"));
        //Method which uses JAXB to convert object to XML
        System.out.println(JaxbObjToXML(resultDataSet));
    }

    public static Object JaxbXmlToObj(String xmlString, Object obj) {

        JAXBContext jaxbContext;
        try {
            jaxbContext = JAXBContext.newInstance(obj.getClass());

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

            Object resultDataSet = (Object) jaxbUnmarshaller.unmarshal(new StringReader(xmlString));

            //System.out.println(resultDataSet);
        }
        catch (JAXBException e) {
            e.printStackTrace();
        }
        return obj;
    }

    public static String JaxbObjToXML(Object object) {
        String xmlContent = null;
        try {
            //Create JAXB Context
            JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());

            //Create Marshaller
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            //Required formatting??
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

            //Print XML String to Console
            StringWriter sw = new StringWriter();

            //Write XML to StringWriter
            jaxbMarshaller.marshal(object, sw);

            //Verify XML Content
            xmlContent = sw.toString();
            //System.out.println(xmlContent);
        }
        catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlContent;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM