【问题标题】:Parsing xml response in JAVA在JAVA中解析xml响应
【发布时间】:2017-07-03 07:39:18
【问题描述】:

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

<?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 来完成。

【问题讨论】:

  • 您可以为此使用 XML 解析器。最简单的一种是 DOMParser,或者您也可以使用 SAXParser。
  • 您可以使用 JAXB 之类的库来解析 xml 文件,如果所有 xml 文件都具有定义的结构,那么您可以映射适当的类来编组文件。
  • 您能否建议如何使用SAXParser 来解析上述xml?

标签: java parsing xml-parsing


【解决方案1】:

以下是 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;
            }
        }
    }
}

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

【讨论】:

  • 感谢您的示例。我正在使用这个例子来解析journaldev.com/1198/java-sax-parser-example 如果我使用这个例子,我需要为scan_list 创建类吗?
  • 不,您不需要,因为我们只提取您需要处理的两个字段。尽管如果您需要解析大型 xml 文件,那么您提到的示例是首选方法。 .
  • 好的,谢谢。此外,在您的 StringReader 对象中,您正在传递字符串。如何直接在 StringReader 对象中传递 xml 文件的位置?类似/Users/pankaj/scan.xml
  • 检查我提供的链接。您可以直接将文件位置的链接传递给 StringReader 例如:** saxParser.parse("c:\\file.xml", handler);**
  • 我正在运行它,System.out.println(obj.processed) 正在返回 null 它不应该为空
【解决方案2】:

使用 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");
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多