libxml2:xpath 中忽略的命名空间

瓦西里·雷德金

我认为,xpath//@ns1:*必须返回命名空间中与 prefix 关联的所有属性ns1但是 libxml2 返回的节点集属性比我预期的要多。

这是我的测试代码。我在 win32 上尝试了 libxml2 2.7.8 版,在 linux 上尝试了 2.9.1 版。

#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <stdio.h>
#include <string.h>

const char* sample_doc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
  "<root xmlns:na=\"urn:test1\">"
    "<el>First</el><!-- comment -->"
    "<el at=\"some attr\" na:a=\"stuff\">Second</el>"
  "</root>";

void die(const char* err)
{
  fprintf(stderr, "ERROR: %s\n", err);
  exit(1);
}

int test()
{
  xmlXPathContextPtr xpathCtx;
  xmlXPathObjectPtr xpathObj;
  xmlDoc *doc = xmlReadMemory(sample_doc, strlen(sample_doc), "noname.xml", NULL, 0);
  xpathCtx = xmlXPathNewContext(doc);
  if(! xpathCtx)
    die("xmlXPathNewContext");
  if(xmlXPathRegisterNs(xpathCtx, BAD_CAST "ns1", BAD_CAST "urn:test1") != 0)
    die("xmlXPathRegisterNs1");
  xpathObj = xmlXPathEvalExpression(BAD_CAST "//@ns1:*", xpathCtx);
  if(! xpathObj)
    die("xmlXPathEvalExpression");
  printf("Found %d nodes:\n", xpathObj->nodesetval->nodeNr);
  for(int i = 0; i < xpathObj->nodesetval->nodeNr; ++i)
  {
    xmlNodePtr n = xpathObj->nodesetval->nodeTab[i];
    xmlChar* t = xmlNodeGetContent(n);
    printf(" type: %d, name: %s, content: %s\n", n->type, n->name, t);
    xmlFree(t);
  }
  xmlXPathFreeObject(xpathObj);
  xmlXPathFreeContext(xpathCtx);
  xmlFreeDoc(doc);
  return 0;
}

int main()
{
  int rc;
  xmlInitParser();
  LIBXML_TEST_VERSION
  rc = test();
  xmlCleanupParser();
  return rc;
}

函数xmlXPathEvalExpression返回具有 2 个节点的节点集,而我期望只有一个。

结果:

$ ./test 
Found 2 nodes:
 type: 2, name: at, content: some attr
 type: 2, name: a, content: stuff

这是 libxml 中的错误还是我的 xpath 错误?

恩韦尔霍夫

这是 libxml2 中的一个错误,已在版本 2.9.2 中通过此提交修复

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法在virtualenv中安装libxml2

C ++中的libxml2,如何设置编码

在nix的libxml2中包括一个目录

如何在标签块libxml2中获取文本?

如何通过使用xpath使用libxml2从C ++中的xml文件中检索节点和特定元素字符串?

忽略xpath选择器中的命名空间不起作用

如何使用gokogiri(libxml2)使用名称空间解析xml?

得到“在库libxml2中找不到函数xmlCheckVersion。是否已安装libxml2?” 通过pip安装lxml时

为什么libxml2在C / C ++代码中到处都使用“ BAD_CAST”?

libxml2:相对于子节点的xpath

libxml2 xpath解析,无法按预期工作

XPath到Python中的命名空间XML?

在Swift 3中使用LibXML2下载时从服务器解析大型XML

如何使用带有 libxml2 库的 C 在 XML 文件中查找特定标记的出现?

如何为libxml2指定默认的输出编码,以防止属性中过多的实体转义?

libxml2 的問題原因(我無法在我的參數中訪問...wifi、藍牙...)

在命名空间环境中,XQuery / Xpath引用没有命名空间的xml元素

Java XPath 处理器忽略命名空间上下文

配置Swashbuckle以忽略模型中的命名空间

LibXML2:如何从节点反向查找XPath表达式

忽略php中带有xpath的名称空间

如何在xmlstarlet中声明XPath命名空间?

使用XMLUnit 1.6的xpath中的命名空间问题

XPath通过命名空间从同级中获取价值

libxml2是否提供了有关XPath语法错误(XML_XPATH_EXPR_ERROR)的描述

libxml2获取xsd验证错误

Libxml2安装到Mac

克隆libxml2文档

需要构建libxml2以支持VFP