我有一个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完成此操作。
答案 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");
}
}