2012-05-24 3 views
1

저는 libxml2를 처음 사용하고 예제로 시작했지만 샘플 코드가 일부 태그를 읽지 못하는 이유를 알지 못합니다. 이런 식으로 XML 파일을 가지고 있습니다. 여기 C에서 Libxml2를 사용하여 XML을 구문 분석 할 수 없습니다

<ACCOUNTS> 
<ACCOUNT NO="123"> 
<STATE>GA</STATE> 
<NAME>John</NAME> 
</ACCOUNT> 
<ACCOUNT NO="123"> 
<STATE>GA</STATE> 
<NAME>Burgess</NAME> 
</ACCOUNT> 
</ACCOUNTS> 

내 샘플 코드입니다 :

void getReference (xmlDocPtr doc, xmlNodePtr cur) { 
    xmlChar *uri; 
    xmlChar *value; 
    cur = cur->xmlChildrenNode; 
    while (cur != NULL) { 
     if ((!xmlStrcmp(cur->name, (const xmlChar *)"ACCOUNT"))) { 
      uri = xmlGetProp(cur,(const xmlChar*) "NO"); 
      printf("uri: %s\n", uri); 
      xmlFree(uri); 
     } 
     cur = cur->next; 
    } 
    return; 
} 

내가 그것을 처음으로 태그를 계정과 가치를 한 후 상태를 무시하고, 다음 계정 태그로 넘어 간다 통지 디버그 NAME 태그. 이 프로그램에서 무엇이 잘못되었으며 이것이 올바른 접근입니까?

답변

3

우선 저는 전문가가 아닙니다 libxml2. 그러나 코드가 노드 계정에서 다음 노드 계정으로 이동한다는 것을 알았습니다. 이는 다른 노드가이 계정 노드 아래에 있기 때문입니다. 이 을 잊어 버리려면 하위 노드를 잊어 버린 후 하위 노드 계층으로 내려와야합니다. 당신이 볼 수 있듯이

<ACCOUNTS> 
    <ACCOUNT NO="123"> 
    <STATE>GA</STATE> 
    <NAME>John</NAME> 
    </ACCOUNT> 
    <ACCOUNT NO="123"> 
    <STATE>GA</STATE> 
    <NAME>Burgess</NAME> 
    </ACCOUNT> 
</ACCOUNTS> 

하면, 노드 statename 노드 account 받고있다 : 당신이 이런 식으로 볼 경우

아마 더 이해할 수 있습니다. 따라서 다음 노드로 이동하는 대신 이전에 각 노드 아래에있는 모든 자식 노드를 실행해야합니다. 이 도움이

subnode = cur->xmlChildrenNode; 
while (subnode != NULL) { 
    if ((!xmlStrcmp(subnode->name, (const xmlChar *)"STATE"))) { 
     // more things... 
    } 
} 

희망이와있는 동안 기본적으로

(간단한 패치 나 빠른 해결책 등), 당신의 if 문 안쪽에, 당신은 중첩을 작성해야합니다.

+1

+1 감사 드리며, 지금 당장 시도하겠습니다. – dicaprio

관련 문제