2016-10-06 10 views
1

다소 큰 XML 파일을 구문 분석하기 위해 libxml ++를 사용하고 있으므로 DOM을 사용할 수 없습니다. TextReader를를 사용하여 중첩 된 노드를 처리하지 않고 모든 책을 통해 루프 방법이 있나요libxml ++ TextReader; 노드 건너 뛰기

<?xml version="1.0"?> 

<root> 

    <book name="book1"> 
    <chapter name="chapter1"> 
     #Pages 
    </chapter> 
    <chapter name="chapter2"> 
     #Pages 
    </chapter> 
    </book> 

    <book name="book2"> 
    <chapter name="chapter1"> 
     #Pages 
    </chapter> 
    <chapter name="chapter2"> 
     #Pages 
    </chapter> 
    </book> 

    <book name="book3"> 
    <chapter name="chapter1"> 
    </chapter> 
     #Pages 
    <chapter name="chapter2"> 
     #Pages 
    </chapter> 
    </book> 

</root> 

:

내가 같은 XML 파일을 말해봐? 일반적으로 SAX 파서를 사용할 수 있습니까?

편집 : 답변 됨.

+1

예, 찾고있는 next() 메소드입니다. 솔루션을 답으로 게시 할 수 있습니까? StackOverflow에서 [자신의 질문에 대답] (http://stackoverflow.com/help/self-answer) 할 수 있습니다. – nwellnhof

+0

안녕하세요 @nwellnhof, 나는 내 질문을 편집하여 가능한 해결책을 답으로 옮겼습니다. 그러나 사용자에 따라 두 솔루션이 맞지 않을 수 있습니다. 필자는 내 생각에 큰 (~ 600MB) XML 파일을 구문 분석해야하므로 제안 된 솔루션이 대부분의 사람들에게 도움이 될 수 있지만 여전히 불행히도 내 필요에 맞지 않습니다. 표시하는 가장 좋은 방법은 내 질문에 부분적으로 만 대답하는 것입니다. –

+1

당신은 이미 모든 사람의 필요에 맞지 않을 수도 있다고 대답하셨습니다. IMO, 당신의 대답은 확실히 충분합니다. 48 시간 내에 [자신의 답변 수락] (http://blog.stackoverflow.com/2009/01/accept-your-own-answers/)을 할 수도 있습니다. 그러나 더 나은 답변을 얻기를 원한다면 그렇게하지 않을 수도 있습니다. – nwellnhof

답변

1

아마도 부분 솔루션을 발견했습니다.

read()는 바로 다음 노드를 읽고 '더 깊은'레이어로 이동하고 next()는 현재 깊이의 다음 노드로 이동합니다. read()를 두 번 호출하면 리더가 첫 번째 책의 시작 태그 (깊이 1)로 이동합니다. next()를 호출하면 리더가 깊이 1 (이 경우 닫는 태그) 인 다음 노드로 건너 뜁니다. next()를 호출하여 모든 책을 반복 할 수 있습니다. 깊이가 1 인 노드가 더 이상 없으면 false를 반환합니다.

불행히도 독자를 트리 위로 이동시킬 수있는 옵션이 없습니다. 루프 내에서 read()를 호출하고 더 깊은 레이어로 이동하면 next()가이 레이어의 다음 노드로 건너 뜁니다. 따라서 대부분의 경우 만족스러운 대답이 아닐 수 있습니다.


또 다른 방법은 get_children을 독자에 get_current_node()를 호출하고 사용하는 것입니다() 직접 자식 노드의 목록을 검색합니다. 이 예제에서는 read()를 호출하여 판독기를 루트 노드로 이동 한 다음 get_current_node() 및 get_children을 각각 호출하고 'book'노드의 결과 목록을 반복 할 수 있습니다.

이는 get_children 전화로, 작은 파일을 작동하는 것 같다() 모든 아이 노드의 일부만으로 단축 목록을 초래할 수 많은 아이 노드와 노드는을 표시. 위에서 설명한대로


I 발견 가능한 해결 (다음 호출하여이 깊이의 노드에 대해 반복하여 원하는 깊이로 이동한다) 및 각 루프 후에 호출하여 새로운 노드 객체를 초기화 TextReader에서 expand()를 사용하면 현재 노드와 모든 하위 트리를 확장 할 수 있습니다. 이렇게하면 TextReader-Object를 변경하지 않고 새 노드에 액세스하여 하위 트리에서 작업 할 수 있습니다.

그러나주의하십시오. free_wrapper()를 호출하지 않으면 새 노드의 C++ - 래퍼가 삭제되지 않습니다. 문서에서

은 :

는 C++ 래퍼는 삭제되지 않습니다. 이 메서드 (expand())를 사용하면 이라는 누출이 발생하지만 응용 프로그램에서 이 아닌 xmlpp :: Node :: free_wrappers()를 호출하면 예외가 발생합니다. 기능 - 문서화가 매우 스파 스 또는 불완전으로이, 내 자신의 관측이다


참고.