2011-05-01 2 views
0

내가 이런 식으로 대략 간다 xml 파일이 세그 폴트 때문에,빈 요소의 원인 libxml은

doc = xmlDocPtr; 
doc = xmlParseFile(file); 
cur = xmlNodePtr; 
cur = xmlDocGetRootElement(doc); 
cur = cur->xmlChildrenNode; 

while (cur != NULL){ // Loop through children of root 

    // Do my thing 

    cur = cur->next; 
} 

가 xmlNodePtr이되면 otherchildren하는이 내용이 없으면 다음 노드 (텍스트 노드)는 NULL

입니다. 이것은 내 문제를 일으키고, 내 루프를 망쳐 버리고, 어떻게 든 segfault를 유발합니다.

명백한 if 문 이외에 어떻게 수정합니까? otherchildren 아래에 더 많은 XML이 있으며 루프가 종료되면 가져올 수 없습니다. 당신의 .XML를 사용

+0

을 사용하면 어떻게됩니까? 이 모든 것이 가능한지 확실하지 않은 경우 – Gerben

+0

아니요, 요점은 다른 아이들이 요소를 보유하기로되어 있지만 때로는 그렇지 않아서 프로그램이이를 처리해야한다는 것입니다. –

+0

나는 당신이하는 일을 이해하지 못하고 그것이 합리적이라고 생각하지 않는다. XML은 목록이 아니라 트리입니다. 각 단계에서 "다음"포인터를 따라 가면 걸을 수 없습니다. 재귀를 사용하거나 백업 할 위치를 추적하여 트리를 백업 할 수 있어야합니다. –

답변

0

, 내가 얻을 :

./SOTrials ../Untitled1.xml 
../Untitled1.xml:10: parser error : expected '>' 
</root> 
^ 
error: could not parse file ../Untitled1.xml 
Speicherzugriffsfehler 

(Speicherzugriffsfehler = 메모리 오류)를 .XML을 변경

... 
</morechildren> 
... 

에 제공합니다

./SOTrials ../Untitled1.xml 
node type: Element, name: text 
node type: Element, name: children 
node type: Element, name: text 
node type: Element, name: otherchildren 
node type: Element, name: text 
node type: Element, name: morechildren 
node type: Element, name: text 

코드가 b 인 것 같습니다. 너의 XML보다 에터.

+0

하, 멋진 잡기,하지만 그건 문제가 아니야. –

+0

@J 브이 : 그래서 무엇이 문제입니까? (otherschildren after otherchildren after all pick up) –

+0

잘 모르겠다. segfault 앞에 텍스트 요소'printf()'d가 없기 때문에 문제라고 생각했다. 나는 좀 더 구체적으로 테스트하는 것을 멈추게하는 또 다른 문제에 부딪혔다. 일단 내가 정리하면 몇 분 후에 다시 돌아올 것이다. –