2012-06-27 4 views
9

SAX API를 사용하여 Java에서 스트림 입력의 루트 요소가없는 XML 조각 목록을 구문 분석하는 것이 가능합니까? 스트림 입력에서 루트 요소가없는 XML 조각 목록을 구문 분석하십시오.

나는 이러한 XML을 구문 분석을 시도했지만 심지어로부터 endDocument 이벤트가 해고되기 전에

org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. 

을 얻었다.

나는 "사용자 지정 루트 요소를 미리 추가하거나 버퍼 된 조각 분석을 사용하십시오"라는 명백하고 어색한 솔루션으로 해결하지는 않을 것입니다.

Java 1.6의 표준 SAX API를 사용하고 있습니다. SAX 팩토리는 누군가가 궁금해 할 경우를 대비해 setValidating (false)했다.

+0

중복 된 http://stackoverflow.com/questions/3232110/parse-file-containing-xml-fragments-in-java. –

+0

[해결 "루트 요소 다음에 나오는 문서의 마크 업은 올바른 형식이어야합니다"예외 (http://opensourceforgeeks.blogspot.in/2015/01/resolving-markup-in-document-following.html)를 참조 할 수 있습니다.) –

답변

14

먼저 가장 중요한 것은 을 구문 분석하는 내용이이라는 XML 문서가 아닙니다.

[정의 :. 정확히 하나 개의 요소가 다른 요소의 내용에 표시되지 않습니다 어떤 부분도있는 루트, 또는 문서 요소 라 불리는,이]

XML Specification에서 이제, SAX와 함께이 구문 분석에로 -에도 불구하고 당신은 어색함에 대해 말 - 나는 다음과 같은 접근 방식 좋을 것 다음를 사용

Enumeration<InputStream> streams = Collections.enumeration(
    Arrays.asList(new InputStream[] { 
     new ByteArrayInputStream("<root>".getBytes()), 
     yourXmlLikeStream, 
     new ByteArrayInputStream("</root>".getBytes()), 
    })); 

SequenceInputStream seqStream = new SequenceInputStream(streams); 

// Now pass the `seqStream` into the SAX parser. 

을은 여러 입력 스트림을 단일 스트림으로 연결하는 편리한 방법입니다. 그들은 생성자에 전달 된 순서대로 읽혀질 것입니다 (또는이 경우 - Enumeration에 의해 반환 됨).

SAX 파서에 전달하면 완료됩니다.

+0

동의 - 어색한 데이터를 다루기 때문에 루트 요소를 추가하는 서투른 이유가 있습니다. 그렇지 않으면 열려있는 첫 번째 요소 인 요소를 닫으면 SAX 파서는 완료된 것으로 간주합니다. 데이터 형식의 XML 스트림에 대해서도이 방법을 사용합니다. – Woody

+0

이미 생각한 답변을 제공했지만 구현 방법이 내가 생각할 수있는 것보다 훨씬 더 우아합니다! 답변 주셔서 감사합니다. – yannisf

+3

글쎄,'SequenceInputStream'은 Java 1.0 이후에도 아무도 알지 못하는 길고 잊혀진 * 유틸리티 중 하나입니다. 아직 거기에 있다는 것을 상기시키고 싶었습니다. :) – npe

관련 문제