2014-03-06 4 views
0

xmlXPathEval을 사용하여 ovf 파일 (XML 형식)에서 일부 노드를 선택했지만 실패했습니다. 구문 분석일부 노드를 성공적으로 선택하기 위해 xmlXPathEval에 필요한 것은 무엇입니까?

XML은 다음과 같습니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<!--Generated by VMware ovftool 3.0.2 (build-931074), UTC time: 2013-07-15T06:41:49.67628Z--> 
    <Envelope vmw:buildId="build-931074" xmlns="http://schemas.dmtf.org/ovf/envelope/1"> 
    //children elements 
    </Envelope> 

, 선택 코드는 다음과 같습니다 :

xmlXPathContextPtr context; 
    xmlXPathObjectPtr obj; 
    xmlNodeSetPtr nodeset=NULL; 
    int32 count=0; 
    //valid doc input 
    assert(doc != NULL); 
    //valid xpath 
    assert(xpath != NULL); 
    assert(nodeset_po != NULL); 

    context = xmlXPathNewContext(doc);· 
    assert (NULL != context); 
    obj = xmlXPathEval((xmlChar *)xpath, context); 
    assert (NULL != obj); 

    if (xmlXPathNodeSetIsEmpty(obj->nodesetval)) { 
     //The select nodes is always empty, even when I use "/Envelope" to select the root element 
     ;; 
    } else { 
     nodeset = obj->nodesetval; 
     count = nodeset->nodeNr; 
     ;; 
    } 

코드의 주석이 failuer을 자세히 설명합니다.

그리고 낯선 사람을 만들 때 다른 XML을 구문 분석 할 대상 파일로 사용하면 예상대로 모든 노드를 선택할 수 있습니다.

xmlXPathEval에 대한 요구 사항이 제대로 작동하는지 궁금합니다.

그런 혼란스러운 결과를 얻으 려하지 않습니까?

+0

내가 다른 추측 모든 노드를 성공적으로 선택할 수있을 때 사용한 xml은 기본 네임 스페이스 ('xmlns = "..."')가 없습니까? – har07

+0

예. 이것 확인. – FaceBro

답변

1

예전 기본 네임 스페이스 문제 인 것처럼 보입니다. XPath /Envelope은 null 네임 스페이스의 요소 만 선택하지만 요소는 네임 스페이스 http://schemas.dmtf.org/ovf/envelope/1에 있습니다.

나는이 특정 라이브러리에 익숙하지 않은,하지만 당신은 네임 스페이스를 선언하고 xmlXPathContext에 그것을 접두어를 지정, 다음의 XPath에 해당 접두어를 사용해야 할 것 같습니다 :

/p:Envelope 
+0

이 문제 여야합니다. 하지만 어떻게 해결할 수 있습니까? 몇 가지 예를 보여 주시겠습니까? – FaceBro

+0

모두 xmlXPathRegisterNs로 수정되었습니다. LOL. – FaceBro

관련 문제