2012-11-27 7 views
0

다음은 여러 XML 파일을 병합하려는 코드입니다. 이 코드에 의해 생성 된 파일을 구문 분석하려고 할 때XML 파일을 병합하는 중 오류가 발생했습니다.

public static void mergeXml(String directory) throws Exception { 
    File dir = new File(directory); 
    File[] rootFiles = dir.listFiles(); 
    XMLEventWriter eventWriter; 
    XMLEventFactory eventFactory; 
    XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); 
    XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
    eventWriter = outputFactory.createXMLEventWriter(new FileOutputStream("temp/testMerge1.xml")); 
    eventFactory = XMLEventFactory.newInstance(); 

    // Create and write Start Tag 
    StartDocument startDocument = eventFactory.createStartDocument("ISO-8859-1"); 
    eventWriter.add(startDocument); 

    for(File rootFile : rootFiles){ 
     XMLEventReader test = inputFactory.createXMLEventReader(new StreamSource(rootFile)); 
     while(test.hasNext()){ 
      XMLEvent event= test.nextEvent(); 
      //avoiding start(<?xml version="1.0"?>) and end of the documents; 
      if (event.getEventType()!= XMLEvent.START_DOCUMENT && event.getEventType() != XMLEvent.END_DOCUMENT) 
       eventWriter.add(event);   

      test.close(); 
     }   

     eventWriter.add(eventFactory.createEndDocument()); 
     eventWriter.close(); 
    } 

} 

오전 얻는 두 가지 문제

  1. 출력 파일은 다음과 같은 예외

를 얻고있는 인코딩

  • 을 가지고 있지 않습니다

    [Fatal Error] :1:2493: The markup in the document following the root element must be well-formed. 
    org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. 
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
        at SplitMain.validateInputFile(SplitMain.java:139) 
        at SplitMain.main(SplitMain.java:76) 
    
  • +0

    파일 인코딩이 잘못 검출되면 조작 된 xml 오류가 발생할 수도 있습니다. 특히 비 라틴 문자가 포함 된 경우. – svz

    답변

    1
    // Create and write Start Tag 
    StartDocument startDocument = eventFactory.createStartDocument("ISO-8859-1"); 
    eventWriter.add(startDocument); 
    

    이 출력 XML 문서의 루트 요소를 만들지 않습니다, 그것은 단순히 <?xml 선언을 기록합니다. StartDocument 후 당신은 또한 추가 할 필요가 StartElement 적합 :

    StartElement startRootElt = eventFactory.createStartElement("", "http://example.com", "root"); 
    eventWriter.add(startRootElt); 
    

    다음 문제는 당신 루프의 내부 eventWriter을 종료하고 있습니다 : 당신은 for 외부에서이 이동해야

    eventWriter.add(eventFactory.createEndDocument()); 
        eventWriter.close(); 
    } 
    

    루프를 시작하고 위에서 시작한 루트 요소를 끝내십시오.

    } 
    eventWriter.add(eventFactory.createEndElement("", "http://example.com", "root")); 
    eventWriter.add(eventFactory.createEndDocument()); 
    eventWriter.close(); 
    

    또한 XML 파일 중 하나에 <!DOCTYPE 문제가 발생할 수 있습니다. 현재 시작 및 종료 문서 이벤트를 무시하는 것과 동일한 방식으로 DTD 이벤트를 무시할 수 있지만이 DTD에서 선언 된 내용에 따라 DTD 이벤트가 작동하는지 여부는 달라집니다. 당신은 그것을 시도하고보아야 할 것입니다.

    +0

    고맙습니다. Ian ...... 2 일 동안 고생했습니다 ... 고맙습니다. :) – user1643087

    0

    당신의 문제는 당신이 맹목적으로 XML 노드를 대상 문서에 추가하려고 시도하는 것일 수 있으며 따라서 하나 이상의 루트 요소로 끝나야한다는 것일 수 있습니다. 이는 XML에서는 허용되지 않습니다.

    출력 문서에서 새로운 최상위 요소를 만들고 대신 XML 노드를 추가 할 수 있습니다.

    +0

    ok .. 내가 시험해보고 올바르게 작동하는 것으로 표시하면 – user1643087

    관련 문제