2017-07-03 90 views
1

我有一个xml文件,如下所示。我想分析该XML,如果<PROCESSED>1</PROCESSED>是具有价值1<STATE>Finished</STATE>被显示为Finished.在JAVA中解析xml响应

<?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来完成为PASS显示结果。

+0

您可以为此使用XML解析器。最简单的是DOMParser,或者您可以使用SAXParser。 –

+0

如果所有xml文件都具有定义的结构,则可以使用类似JAXB的库来解析xml文件,而不是为映射合适的类来封送文件。 – drgPP

+0

你可以请建议如何'SAXParser'将被用来解析上述XML? – meallhour

回答

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; 
      } 
     } 
    } 
} 

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

+0

谢谢你的例子。我使用这个例子来解析http://www.journaldev.com/1198/java-sax-parser-example如果我使用这个例子,我需要为'scan_list'创建类吗? – meallhour

+0

不,您不需要,因为我们只提取需要处理的两个字段。虽然如果你需要解析一个大的XML文件,那么你提到的例子是首选的方法。 。 –

+0

好的谢谢。另外,在你的StringReader对象中传递字符串。我怎样才能直接在'StringReader'对象中传递xml文件的位置?类似'/ Users/pankaj/scan.xml' – meallhour

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

}