Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xmlXPathEval成功选择某些节点需要什么?_Xml_Xpath - Fatal编程技术网

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

xmlXPathEval成功选择某些节点需要什么?,xml,xpath,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="h

我使用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是否需要正常工作


还是我遗漏了一些东西来获得如此混乱的结果?

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

我不熟悉这个特定的库,但看起来您需要在
xmlXPathContext
中声明名称空间并为其分配前缀,然后在XPath中使用该前缀:

/p:Envelope

我想,您在成功选择所有节点时使用的另一个xml没有默认名称空间(
xmlns=“…”
)?是的。检查一下,一定是这个问题。但是我怎么才能解决这个问题呢?你能给我看一些例子吗?都是用xmlXPathRegisterNs修复的。英雄联盟