2010-12-28 3 views
2

XML 구문 분석에 대한 질문이 있습니다. 나는 예제 프로그램을 실험하고 있었는데 파싱이 어떻게 작동 하는지를 이해하려고 약간 수정했다. 나는 꽤 이해할 수없는 결과를 얻었고, 여러분 중 일부는 어떤 일이 벌어지고 있는지에 관해 밝힐 수 있기를 희망한다.xerces-c : DOM xml 구문 분석

이 내 XML 파일입니다

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root xmlns="http://www.test.com"> 
    <ApplicationSettings> 
      <option_a>"10"</option_a> 
      <option_b>"24"</option_b> 
    </ApplicationSettings> 
</root> 

내가() 함수는 getChildNodes 같은 호출 할 때에 간다가 호출로 처리하는 것을 이해하려고 내 프로그램 전반에 걸쳐 디버그 문을 삽입. 이 출력은 내가받은 출력입니다.

Parsing xml file... 
Processing Root... 
Processing children with getChildNodes()... 
>>>>>>>>>>> Loop child 0: Node name is: #text 
>>>>>>>>>>> Loop child 1: Node name is: ApplicationSettings 
= ApplicationSettings processing children with getChildNodes()... 
***** iter 0 child name is #text 
***** iter 1 child name is option_a 
***** iter 2 child name is #text 
***** iter 3 child name is option_b 
***** iter 4 child name is #text 
>>>>>>>>>>> Loop: 2 Node name is: #text 

출력에서 ​​나는 올바르게 xml 파일을 올바르게 파싱했다고 추측 할 수 있습니다. 그러나이 프로그램은 또한 # 텍스트 (getNodeName() 함수를 사용하여 출력)이라는 추가 노드를 감지했습니다. 내 질문은 무엇입니까 그 # 언급하고 왜 그들은 주기적으로 루프 전체에 나타 납니까?

감사합니다.

답변

3

예제의 #text 노드는 태그 사이의 공백을 참조합니다. 여기에서 예를 들어

<root xmlns="http://www.test.com"> 
    <ApplicationSettings> 

는 줄 바꿈 ...com"><App... 사이에 공백이 4이다.

당신은 어떻게되는지 다음 구문 분석을 시도 할 수 있습니다 :

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root xmlns="http://www.test.com"><ApplicationSettings><option_a>"10"</option_a><option_b>"24"</option_b></ApplicationSettings></root> 
+0

흥미 롭. 나는 여하튼 공백으로 다룬 느낌이 들었다. 루핑시 여분의 오버 헤드를 피할 수 있도록 이러한 공백을 자식 노드로 추가하는 것을 피할 수있는 방법이 있는지 알고 계십니까? 유일한 해결책을 파싱하고 있습니까? – user459811

+0

@ user459811 저는 xerces에 익숙하지 않습니다. 죄송합니다. "공백 무시"와 같은 것을 찾으려면 문서를 참조해야합니다. – khachik

+0

감사합니다 Khachik. 나는 if-conditional을 사용하여 관심있는 사람이 있으면 공백을 무시했다. if ((currentNode-> getNodeType() == DOMNode :: TEXT_NODE) ​​|| (currentNode-> getNodeType() == DOMNode :: COMMENT_NODE)) {계속; } – user459811