2011-06-12 4 views
2

다음과 같은 XML 문서가 순차적으로있는 파일이 있습니다.Java XML 구문 분석

<?xml version="1.0"?><Node>...<Node>...</Node>...</Node><?xml version... 

여러 번 반복한다.

Java를 사용하면 FileChannel 파일이 열리고 읽을 바이트 버퍼가 있습니다. 자바와 함께 XML 바이트를 부분적으로 파싱 할 수있는 방법이나 쉬운 방법 또는 이미 해결 된 방법이 있다면 감사하겠습니다. 이 같은 예를 들어

FooParser parser = new FooParser(); 

while (...) 
{ 
    buffer.flip(); 
    parser.parse(buffer); 
    buffer.compact(); 
    if (parser.done()) 
    { 
     xmlDocs.add(parser.xml()); 
     parser.reset(); 
    } 
    file.read(buffer); 
    ... 
} 

답변

2

내가 단일 스트림에서 여러의 XML 문서를 구문 분석이 알고있는 API의 아무것도 없습니다. 내 생각에 <?xml ... 태그를 스캔하고 입력을 분리해야 할 것입니다. 파서는 태그를 읽을 때까지 다음 XML 문서에 도달했는지 여부를 알 수 없습니다. 그 시점에서 그것은 질식 할 것이고 다음 xml 문서의 시작 태그는 이미 읽혀질 것입니다.

실제로 이제 언급 했으므로 원하는 작업을 수행하기 위해 끌어 오기 구문 분석기를 사용할 수 있습니다. 그러나 나는 API에서 SAX와 DOM 파서가 당신이 원하는 것을하지 않을 것이라고 확신합니다.

+0

파서는 현재 XML 권한의 끝을 감지 할 수 있어야합니까? 왜 현재 XML보다 더 많은 정보를 읽어야할까요? – foobarometer

+0

파서는 문서 형식이 올바른지 확인합니다. 하나의 규칙은 하나의 루트 태그를 가지고 있다는 것입니다. 파서는 마지막에 올 때까지 또는 두 번째 루트 레벨 태그가 나타날 때까지 계속 읽기를 수행하고 예외를 throw합니다. 이 시점에서 두 번째'

+0

감사합니다. Ted, 나는 당신에게 동의합니다. 이것은 잘 형성됨 규칙에 위배되며 파서는이를 확인해야합니다. 누군가 통찰력을 가지고 있다면 잠시 질문을 떠날 것입니다, 감사합니다! – foobarometer

0

실제로 XML 파일은 xml 선언으로 시작해야하기 때문에 XML 파일의 시작 부분에 <? 시퀀스가 ​​있는지 확인하는 것이 일반적입니다 (파일 중간에 BOM이 있어야하는 것은 아닙니다). 그래서 인코딩을 살펴본 다음 파일이 이미 <? 및 "xml"이후에 모두 제안 된대로 분할합니다 ...

+0

실제로 전체 파일을 읽는 것이 나를위한 옵션이 아닐 수도 있습니다. 그래서 아마 파일 채널을 사용하여 한 번에 몇 바이트를 읽는 파서를 작성할 것입니다. 감사! – foobarometer

+0

물론, 파일을 분할하기 만하면 전체 파일을 한 번에 읽을 필요가 없습니다. – Clemens

+0

여전히 네트워크에서 스트리밍을 통해 이루어지면 어떤 작업을 수행 할 것인가하는 작업입니다. 어쨌든 감사합니다! – foobarometer

1

나는 이런 식으로해야만하고 대답했습니다 (자신) here 보다 간단한 사용을 위해 모든 것을 래핑하는 리더 하위 클래스입니다.