2014-03-27 2 views
0

XML과 비슷한 텍스트 파일을 읽어야합니다. 텍스트 파일은 부모 태그가있는 여러 개의 XML 파일로 이루어져 있습니다. 파일을 한 줄씩 구문 분석해야하고 한 줄에서 다른 텍스트 파일로 부모 태그 안에 여러 번 반복되는 필수 자식 태그의 해당 요소를 작성하십시오. 부모 태그 뒤에 다음 행에 요소를 써야합니다. 파일을 읽는 방법을 알고 있고 그 파일을 써라. 그러나 나는 그것이 요구 사항에 따라 그것을 읽는 논리를 얻을 수 없다. 나를 도와 줘라. 아무 도움도 많이 감사하지 않는다.XML과 유사한 java에서 텍스트 파일 구문 분석

AbcdeXYZ-23243423

<parentnode xmlns="http://www.fpml.org/FpML-5/recordkeeping" fpmlVersion="5-5" xmlns:abcde="http://www.abcde.com/ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abcde.com/ext /../xmls/XYZ/recordkeeping/abcde-ext.xsd"> 
<Child1 Child1Scheme="http://www.google.com">1234566546</Child1> 
<Child1 Child1Scheme="http://www.fpml.org/coding-scheme/external/UNique">AbcdeXYZ-154555</Child1> 
<country countryScheme="http://www.fpml.org/coding-scheme/external/country-identifier">1030253498</country> 
<state stateScheme="http://www.fpml.org/coding-scheme/external/state-identifier">434343242</state> 
</parentnode> 

<parentnode xmlns="http://www.fpml.org/FpML-5/recordkeeping" fpmlVersion="5-5" xmlns:abcde="http://www.abcde.com/ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abcde.com/ext /../xmls/XYZ/recordkeeping/abcde-ext.xsd"> 
<Child1 Child1Scheme="http://www.google.com">1234566546</Child1> 
<Child1 Child1Scheme="http://www.fpml.org/coding-scheme/external/UNique">AbcdeXYZ-4566545</Child1> 
<country countryScheme="http://www.fpml.org/coding-scheme/external/country-identifier">1030253498</country> 
<state stateScheme="http://www.fpml.org/coding-scheme/external/state-identifier">2323232323</state> 
</parentnode> 
+1

루트 노드에서 모두 감싸고 xml 파서를 사용할 수 없습니까? 그렇지 않으면 여러 XML 파일을 분리하여 별도로 구문 분석 할 수있는 방법을 찾을 수 있습니다. – Danny

+0

@ 대니 그것은 텍스트 파일로 구문 분석되어야합니다. – Euphoria

+0

XML은 텍스트 파일입니다. – m0skit0

답변

0

당신은 대기열 구조를 사용해야합니다 [선입은]

귀하의 기본 너 한테은

같은 것
  1. 태그를 만나면 그 값을 사용하십시오.
  2. 태그를 FIFO에 저장하십시오.
  3. 닫는 태그를 만나면 FIFO 에 저장된 태그와 일치합니다. 유효하다면 예외를 던집니다. 예외가 발생합니다.
  4. 구문 분석이 끝나면 Q가 비어 있어야합니다.

물론 다른 라이브러리를 사용할 수 있습니다.

1

xml을 손으로 구문 분석하는 것은 시간 낭비입니다. wrapping 태그로 임시 파일을 만들고 다음과 같이 xml 파서를 사용하는 것이 훨씬 쉽습니다.

Path inputFile = Paths.get("input.xml"); 
    Path tempFile = Paths.get("temp.xml"); 
    Path outputFile = Paths.get("output.xml"); 

    // make a temp file with fixed xml formatting 
    Files.write(tempFile, "<root>".getBytes()); 
    for (String line : Files.readAllLines(inputFile, StandardCharsets.UTF_8)) { 
     Files.write(tempFile, line.getBytes(), StandardOpenOption.APPEND); 
    } 
    Files.write(tempFile, "</root>".getBytes(), StandardOpenOption.APPEND); 


    // parse xml and build output string 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(tempFile.toFile()); 
    StringBuilder sb = new StringBuilder(); 

    NodeList parents = doc.getElementsByTagName("parentnode"); 
    for (int i = 0; i < parents.getLength(); i++) { 
     NodeList children = parents.item(i).getChildNodes(); 
     for (int j=0; j<children.getLength(); j++) { 
      sb.append(children.item(j).getTextContent() + " "); 
     } 
    } 


    // clean up temp file 
    Files.delete(tempFile); 


    // write output file 
    Files.write(outputFile, sb.toString().getBytes()); 
+0

정말 도움을 주셔서 감사합니다.하지만 텍스트 파일을 파싱하려고합니다. 여러 XML 파일이 차례로 나옵니다. 텍스트 파일을 구문 분석하는 로직을 알려주십시오. 요구 사항은 – Euphoria

+0

입니다. 제가 작성하고 작성한 코드를 살펴보고 그 이유와 이유에 대해 생각해보십시오. – azurefrog

+0

각 XML 문서를 쉽게 찾을 수있는 유일한 방법은 루트 노드를 추가 한 다음 azurefrog의 솔루션처럼 XML 파서가 열심히 할 수있게하는 것입니다. 전체 파일이 너무 커서 메모리에 맞지 않으면 DOM 대신 SAX 또는 StAX 파서를 사용할 수 있습니다. 유일한 대안은 수동으로 XML을 구문 분석하는 것입니다. 그러나 그것은 훨씬 더 많은 작업을 의미 할 것입니다. 저것을 정당화하는 아주 좋은 이유가 있어야한다. – vanje