2015-01-22 2 views
0

xml 파일에서 MasterData.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> 

자바 코드를 많은 XML을 files.Please 도움말에서 특정 프로토콜을 찾고, 즉 제 2 부분의 첫번째 부분 만 가지고 문제를 할 수 있어요

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

제가 올바르게 이해한다면, 나는 두 단계로 그렇게 할 것입니다.
1) MasterData.xml 파일에있는 모든 프로토콜의 목록을 만듭니다.
2) 프로토콜이 키인 맵을 작성하십시오.이 값은이 프로토콜을 포함하는 모든 파일의 목록입니다. 그리고 아마 검색을 단순화하기 위해 XPath (http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/)를 사용할 것입니다.

+0

예 위 코드에서 볼 수 있듯이 1 부를 할 수 있습니다. 그것은 두 번째 부분은 내가 도움이 필요합니다 ... – Lucy

+0

somes 힌트 내가 그런 someting 할 것입니다 : 1) 프로토콜이 키이며, 각 프로토콜에 대한 초기화 문자열 목록을 초기화 1) 디렉토리의 각 파일에 대한 2) 열어서 Xpath를 통해 프로토콜을 검색하십시오. 3) 발견 된 각 프로토콜에 대해 map 요소를 가져 와서 파일 이름을 목록에 추가하십시오 – vincent

관련 문제