解析 XML 并将数据设置为模型 class

Parse XML and set data to Model class

我有一个 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 class.i。e 每个 <parameter> 标签数据应设置为 pojo class 各自的字段。

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 倍。为此,我们必须创建一个处理程序 class 并扩展 DefaultHandler。 SAXParser 按顺序解析 XML 文件。您必须覆盖三个方法:

startElement- 当 SAXParser 在 XML

中获取开始标记时调用此方法

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

endElement - 当 SAXParser 在 XML

中获取结束标记时调用此方法

参见下面的示例代码。我已经在编辑器中输入了它,但还没有测试过。可能会有编译时错误。但大部分是正确的。还添加了主要方法,我在其中添加了代码来调用处理程序 class 并解析 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();
     }
 }
}

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

你可以使用这种类型的结构

$attribute = "attr";
$model->$attribute_name = $value; // that work as $model->attr = $value