xmlXPathEval成功选择某些节点需要什么?

时间:2014-03-06 05:27:19

标签: xml xpath

我使用xmlXPathEval从ovf文件(xml格式)中选择一些节点,但是失败了。

要解析的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;
        ;;
    }

代码中的注释详细说明了失败者。

为了使它更奇怪,当我使用另一个xml作为目标文件进行解析时,我可以按预期选择所有节点。

所以我想知道xmlXPathEval是否有正常工作的要求?

或者我错过了一些令人困惑的结果?

1 个答案:

答案 0 :(得分:1)

看起来这是旧的默认命名空间问题。 XPath /Envelope只会选择null命名空间中的元素,但您的元素位于命名空间http://schemas.dmtf.org/ovf/envelope/1中。

我不熟悉这个特定的库,但看起来你需要声明命名空间并在xmlXPathContext中为它指定一个前缀,然后在XPath中使用该前缀:

/p:Envelope