显示包含特定字符串的所有XML文件的名称

时间:2015-01-22 14:05:47

标签: java xml xml-parsing string-parsing stax

我正在尝试从名为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行,我正在寻找一种消耗更少内存的解决方案。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,我会分两步完成。
1)列出MasterData.xml文件中找到的所有协议 2)创建一个协议是密钥的映射,值将是包含该协议的所有文件的列表。 我可能会使用XPath(http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/)来简化搜索。