在JAVA中解析xml响应

时间:2017-07-03 07:39:18

标签: java parsing xml-parsing

我有一个xml文件,如下所示。我想解析这个xml并将结果显示为PASS,如果<PROCESSED>1</PROCESSED>的值为1<STATE>Finished</STATE>显示为Finished.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE SCAN_LIST_OUTPUT SYSTEM "https://qualysapi.qualys.com/api/2.0/fo/scan/scan_list_output.dtd">
<SCAN_LIST_OUTPUT>
    <RESPONSE>
        <DATETIME>2017-06-12T07:28:46Z</DATETIME>
        <SCAN_LIST>
            <SCAN>
                <ID>3332486</ID>
                <REF>compliance/1347341337.35943</REF>
                <TYPE>Scheduled</TYPE>
                <TITLE><![CDATA[MY PC Scan]]></TITLE>
                <USER_LOGIN>USER</USER_LOGIN>
                <LAUNCH_DATETIME>2017-06-13T07:30:09Z</LAUNCH_DATETIME>
                <DURATION>00:06:29</DURATION>
                <PROCESSED>1</PROCESSED>
                <STATUS>
                    <STATE>Finished</STATE>
                </STATUS>
                <TARGET><![CDATA[10.10.25.50]]></TARGET>
            </SCAN>
        </SCAN_LIST>
    </RESPONSE>
</SCAN_LIST_OUTPUT>

请告诉我如何使用Java完成此操作。

2 个答案:

答案 0 :(得分:0)

以下是SAXParser的示例实现:

您首先需要创建一个处理程序才能使用SAXParser,有关详细信息,请访问链接:https://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

class ReadXMLFile {

    String processed, state;

    public void parseXml() {
        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            StringReader sr = new StringReader("<SCAN_LIST_OUTPUT>     <RESPONSE>         <DATETIME>2017-06-12T07:28:46Z</DATETIME>         <SCAN_LIST>             <SCAN>                 <ID>3332486</ID>                 <REF>compliance/1347341337.35943</REF>                 <TYPE>Scheduled</TYPE>                 <TITLE><![CDATA[MY PC Scan]]></TITLE>                 <USER_LOGIN>USER</USER_LOGIN>                 <LAUNCH_DATETIME>2017-06-13T07:30:09Z</LAUNCH_DATETIME>                 <DURATION>00:06:29</DURATION>                 <PROCESSED>1</PROCESSED>                 <STATUS>                     <STATE>Finished</STATE>                 </STATUS>                 <TARGET><![CDATA[10.10.25.50]]></TARGET>             </SCAN>         </SCAN_LIST>     </RESPONSE> </SCAN_LIST_OUTPUT>");
            //Reader sr = new InputStreamReader(new ByteArrayInputStream(data.getBytes()), "UTF-8");
            InputSource is = new InputSource(sr);
            saxParser.parse(is, new SampleHandler());

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

    public static void main(String argv[]) {

        ReadXMLFile obj = new ReadXMLFile();
        obj.parseXml();
        System.out.println(obj.processed);
        System.out.println(obj.state);

    }

    private class SampleHandler extends DefaultHandler {

        boolean bprocessed = false;
        boolean bstate = false;


        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {

            if (qName.equalsIgnoreCase("PROCESSED")) {
                bprocessed = true;
            }

            if (qName.equalsIgnoreCase("STATE")) {
                bstate = true;
            }
        }

        public void endElement(String uri, String localName,
                String qName) throws SAXException {
        }

        public void characters(char ch[], int start, int length) throws SAXException {

            if (bprocessed) {
                processed = new String(ch, start, length);
                bprocessed = false;
            }

            if (bstate) {
                state = new String(ch, start, length);
                bstate = false;
            }
        }
    }
}

请注意,这是示例实施,您可能需要根据需要进行更改。

答案 1 :(得分:0)

使用XPath和VTD-XML,它是一个10行的应用程序。

import com.ximpleware.*;

public class testData {

    public static void main(String[] args) throws VTDException {
        // TODO Auto-generated method stub
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("d:\\xml\\scan_input.xml", false))
            return ;
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        String xpath = "/SCAN_LIST_OUTPUT/RESPONSE/SCAN_LIST/SCAN/PROCESSED=1 "+
                       "and /SCAN_LIST_OUTPUT/RESPONSE/SCAN_LIST/SCAN/STATUS/STATE='Finished' ";
        ap.selectXPath(xpath);
        if (ap.evalXPathToBoolean())
            System.out.println("pass");
    }

}