我正在尝试从名为MasterData.xml的xml文件中提取包含特定关键字的所有协议,然后在包含许多xml文件的名为DataDefinition的文件夹中搜索每个协议。我能够完成第一部分,但在第二部分遇到麻烦,即在许多xml文件中搜索特定协议。请帮助..
MasterData.xml
<?xml version="1.0" encoding="UTF-8"?>
<CDMDataXML xmlns="http://www.avocent.org/trellis/CDMLoaderXMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.avocent.org/trellis/CDMLoaderXMLSchema CDMLoaderXMLSchema.xsd">
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004236">
<NAME>res.dcim.networkprotocol.def.SNMPV1-SSL</NAME>
<PROTOCOLTAG>SNMPV1:SSL</PROTOCOLTAG>
</NetworkProtocolDefinition>
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004237">
<NAME>res.dcim.networkprotocol.def.SNMPV2-SSL</NAME>
<PROTOCOLTAG>SNMPV2:SSL</PROTOCOLTAG>
</NetworkProtocolDefinition>
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004238">
<NAME>res.dcim.networkprotocol.def.BACNET-SITELINK_W-LDM-BREAKER-RS-485</NAME>
<PROTOCOLTAG>BACNET:SITELINK_W-LDM-BREAKER/RS-485</PROTOCOLTAG>
</NetworkProtocolDefinition>
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004239">
<NAME>res.dcim.networkprotocol.def.BACNET-SITELINK_W-LDM-SUBFEED-RS-485</NAME>
<PROTOCOLTAG>BACNET:SITELINK_W-LDM-SUBFEED/RS-485</PROTOCOLTAG>
</NetworkProtocolDefinition>
</CDMDataXML>
Java Code ..
Integer files_no= null;
File xml_files = new File("D:\\branches\\ENGINE-R3.2\\components\\ElementLibraries\\ElementLibraryPackages\\DataDefinition");
files_no = xml_files.listFiles().length;
String crits[] = new String [100];
Integer i = 0;
Integer COUNTER = 0;
XMLInputFactory f = XMLInputFactory.newInstance();
XMLStreamReader rdr = f.createXMLStreamReader(new FileReader("D:\\lucy\\MasterData\\MasterData.xml"));
while (rdr.hasNext()) {
if (rdr.next() == XMLStreamConstants.START_ELEMENT) {
if (rdr.getLocalName().equals("PROTOCOLTAG")) {
String txt = rdr.getElementText();
if (txt.contains("SITELINK")) { // You can also use "txt.indexOf("SITELINK") > 0"
System.out.println(txt);
COUNTER++;
crits[i]=txt;
i++;
}
}
}
}
System.out.println(COUNTER+"\n");
System.out.println(files_no);
所以我想在位于DataDefinition文件夹的所有XML文件中搜索以下2个协议,并打印包含该特定协议的文件的名称。
BACNET:SITELINK_W-LDM-BREAKER/RS-485
BACNET:SITELINK_W-LDM-SUBFEED/RS-485
由于文件夹中的某些文件有30k行,我正在寻找一种消耗更少内存的解决方案。
答案 0 :(得分:0)
如果我理解正确,我会分两步完成。
1)列出MasterData.xml文件中找到的所有协议
2)创建一个协议是密钥的映射,值将是包含该协议的所有文件的列表。
我可能会使用XPath(http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/)来简化搜索。