java - 解析 XML 并将数据设置到 Model 类

标签 java php jakarta-ee xml-parsing domparser

我有一个下面的 XML 文件需要解析:

<API version="1.0">
<response>
<operation name="GET_REQUEST">
<result>
<statuscode>200</statuscode>
<status>Success</status>
<message>Request details fetched successfully.</message>
</result>
<Details>
<parameter>
<name>id</name>
<value>53481</value>
</parameter>
<parameter>
<name>requester</name>
<value>controlm</value>
</parameter>
<parameter>
<name>createdby</name>
<value>controlm</value>
</parameter>
<parameter>
<name>createdtime</name>
<value>1301369106124</value>
</parameter>
<parameter>
<name>duebytime</name>
<value>1302017399984</value>
</parameter>
<parameter>
<name>responseduebytime</name>
<value>-1</value>
</parameter>
<parameter>
<name>fr_duetime</name>
<value>-1</value>
</parameter>
<parameter>
<name>respondedtime</name>
<value>0</value>
</parameter>
<parameter>
<name>resolvedtime</name>
<value>0</value>
</parameter>
<parameter>
<name>completedtime</name>
<value>1301975054764</value>
</parameter>
<parameter>
<name>shortdescription</name>
<value/>
</parameter>
<parameter>
<name>timespentonreq</name>
<value>0hrs 0min</value>
</parameter>
<parameter>
<name>subject</name>
<value>PISSUPP IP-SUPP 26834 IP3STG167 OVERRUNNING - IMM</value>
</parameter>
<parameter>
<name>requesttemplate</name>
<value>Control-M</value>
</parameter>
<parameter>
<name>mode</name>
<value>Auto Ticketing</value>
</parameter>
<parameter>
<name>sla</name>
<value>P3 SLA</value>
</parameter>
<parameter>
<name>ASSET</name>
<value/>
</parameter>
<parameter>
<name>DEPARTMENT</name>
<value/>
</parameter>
<parameter>
<name>site</name>
<value>Service Desk</value>
</parameter>
<parameter>
<name>category</name>
<value>Infrastructure</value>
</parameter>
<parameter>
<name>SUBCATEGORY</name>
<value/>
</parameter>
<parameter>
<name>ITEM</name>
<value/>
</parameter>
<parameter>
<name>technician</name>
<value>rajesh</value>
</parameter>
<parameter>
<name>status</name>
<value>6.Closed</value>
</parameter>
<parameter>
<name>priority</name>
<value>P3</value>
</parameter>
<parameter>
<name>impact</name>
<value>3.Low</value>
</parameter>
<parameter>
<name>urgency</name>
<value>1.High</value>
</parameter>
<parameter>
<name>REQUESTTYPE</name>
<value/>
</parameter>
<parameter>
<name>CLOSURECODE</name>
<value/>
</parameter>
<parameter>
<name>CLOSURECOMMENTS</name>
<value/>
</parameter>
<parameter>
<name>group</name>
<value>Command Center</value>
</parameter>
<parameter>
<name>description</name>
<value/>
</parameter>
<parameter>
<name>control_m</name>
<value>TTD2ETLDC</value>
</parameter>
<parameter>
<name>mem_name</name>
<value>CUSTOMER_DERIVED_TEMP2_REP.sh</value>
</parameter>
<parameter>
<name>order_id</name>
<value>02kbc</value>
</parameter>
<parameter>
<name>job_name</name>
<value>IP3STG167</value>
</parameter>
<parameter>
<name>owner</name>
<value>ttdbods</value>
</parameter>
<parameter>
<name>status reason</name>
<value/>
</parameter>
<parameter>
<name>Main Service Affected</name>
<value/>
</parameter>
<parameter>
<name>Layer</name>
<value/>
</parameter>
<parameter>
<name>ACC Task</name>
<value/>
</parameter>
<parameter>
<name>No of ACC Task</name>
<value/>
</parameter>
<parameter>
<name>failedtime</name>
<value>29 Mar 2011, 04:24:39</value>
</parameter>
<Notes URI="http://localhost:8400/sdpapi/request/53481/notes/"/>
<Worklogs URI="http://localhost:8400/sdpapi/request/53481/logs/"/>
</Details>
</operation>
</response>
</API>

我的要求是解析这个XML文件并将数据设置为pojo类。即每个<parameter>标签数据应设置为pojo类各自的字段。

public class Data {
    private int id;
    private String requester;
    private String createdby;
    private String createdtime;
    private String duebytime;
    private String shortdesciption;
    private String timespentonreq;
    private String subject;

    etc..fields..........

    //setters and getters


}

这里是打印每个值的代码:

Document doc = null;
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(
                    xmlData.getBytes("utf-8"))));
            doc.getDocumentElement().normalize();

            NodeList nodes = doc.getElementsByTagName("parameter");
            for (int i = 0; i < nodes.getLength(); i++) {
                Node node = nodes.item(i);

                Element eElement = (Element) node;

                String ticketDetails = getTagValue("value", eElement);

                if (ticketDetails != null) {

                    System.out.println("ticketDetails : "
                            + getTagValue("value", eElement));

                }

            }
private static String getTagValue(String tag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(tag).item(0)
            .getChildNodes();

    Node nValue = (Node) nlList.item(0);
    if (nValue == null)
        return "No Value";
    return nValue.getNodeValue();
}

我在这个link中使用了DOM XmL解析器.使用这个我能够解析和打印数据。但我无法将数据设置到各个字段。 有人可以帮忙吗?

最佳答案

最有效的方法是使用 SAX 解析器。它的效率是 DOM 解析器的 3 倍。为此,我们必须创建一个处理程序类并扩展 DefaultHandler。 SAXParser 按顺序解析 XML 文件。您必须重写三个方法:

startElement-当SAXParser获取XML中的开始标签时调用该方法

characters - 当 SAXParser 获取 XML 中标记之间的内容时调用此方法。但是,如果标签的内容很大,那么它可能会调用多个标签,并且每次它都有该内容的一部分。这就是我在下面的示例代码中使用 StringBuilder 的原因。并确保在使用 StringBuilder 对象后在 endElement 方法中删除该对象的内容。

endElement - 当 SAXParser 获取 XML 中的结束标记时调用此方法

请参阅下面的示例代码。我已经在编辑器中输入了它,但还没有测试过。可能会出现编译时错误。但大多数情况下它是正确的。还添加了 main 方法,我在其中添加了调用处理程序类并解析 XML 的代码。

    public class ParameterHandler extends DefaultHandler {
 private Data data = null;
 private StringBuilder contentsOfTheCurrentTag=null;
 private Parameter parameter = null;

 public ParameterHandler(){
        contentsOfTheCurrentTag =new StringBuilder();
    }

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("Details")) {
            data=new Data();            
        }
        if (qName.equalsIgnoreCase("Parameter")) {
            parameter=new Parameter();          
        }


    }

    public void endElement(String uri, String localName,
        String qName) throws SAXException {
        System.out.println("End Element :" + qName);
        int length = contentsOfTheCurrentTag.length();
        if (qName.equalsIgnoreCase("name")) {
            parameter.setName(contentsOfTheCurrentTag.toString().trim());
        }

        if (qName.equalsIgnoreCase("value")) {
            parameter.setValue(contentsOfTheCurrentTag.toString().trim());
        }

        if (qName.equalsIgnoreCase("parameter")) {
            if("id".equals(parameter.getName())){
                data.setId(parameter.getValue())
            }
            else if("requester".equals(parameter.getName())){
                data.setRequester(parameter.getValue())
            }
            .
            .so On...
        }
        contentsOfTheCurrentTag.delete(0,length);

    }

    public void characters(char ch[], int start, int length) throws SAXException {
         contentsOfTheCurrentTag.append(ch, start, length); 
    }



    //Add getter setter for data
}



public class ReadXMLFile {

   public static void main(String argv[]) {

    try {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    PremiumHandler handler= new PremiumHandler();
    saxParser.parse("c:\\file.xml", handler);
    Data data=handler.getData();

     } catch (Exception e) {
       e.printStackTrace();
     }
 }
}

如果您在使用时遇到问题,请告诉我。

关于java - 解析 XML 并将数据设置到 Model 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643233/

相关文章:

Java,thread.sleep()阻止按钮的使用(不识别按钮点击)

java - 文件下载器中基本访问认证的问题

javascript - 单击更改按钮并在数据库中记录更新,反之亦然

java - 如何在 Payara 中引用文件

java - ListSelectionListener 事件延迟

java - 如何从 Java/Scala 使用 Unix 域套接字?

php - MySQL 只跨表拉取一行

php - Magento 以编程方式添加产品图片

java - weblogic.descriptor.DescriptorException : Unmarshaller failed

java - 为什么我得到的 Display is not abstract 并且不会覆盖 Display 中的抽象方法 actionPerformed() ?