【问题标题】:Display names of all XML files containing a particular string显示包含特定字符串的所有 XML 文件的名称
【发布时间】:2015-01-22 14:05:46
【问题描述】:

我正在尝试从名为 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 代码..

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,正如您从我上面的代码中看到的那样,我能够完成第一部分。这是我需要帮助的第二部分..
    • 一些提示我会做类似的事情:1)初始化一个协议是关键的地图,并为每个协议初始化一个字符串列表1)为目录中的每个文件2)打开它,通过 Xpath 搜索协议 3) 为每个创建的协议,获取地图元素并将文件名添加到列表中
    猜你喜欢
    • 2022-07-19
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2012-07-04
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多