【发布时间】:2011-09-12 02:11:29
【问题描述】:
我查看了文档,看来您只能通过创建 xpath context 从 xmlDocPtr 执行 xpath 搜索。 libxml2 中是否有从xmlNodePtr 进行 xpath 搜索的方法?
【问题讨论】:
我查看了文档,看来您只能通过创建 xpath context 从 xmlDocPtr 执行 xpath 搜索。 libxml2 中是否有从xmlNodePtr 进行 xpath 搜索的方法?
【问题讨论】:
调用xmlXPathNewContext(),为文档指定真正的顶级xmlDocPtr,然后将xmlXPathContext::node字段设置为所需的xmlNodePtr指针,该指针是xmlDocPtr文档的子级。
【讨论】:
xmlXPathContextPtr xpContext = xmlXPathNewContext((xmlDocPtr)node);
xmlDocPtr 参数指向一个真实的 xmlDoc 对象。它作为各种 API 调用的 xmlDocPtr 参数在内部传递。 xmlXPathContext 有一个单独的 node 字段,用于跟踪正在处理的实际文档子 xmlNodePtr。仅仅因为将 xmlNodePtr 指针作为类型转换的 xmlDocPtr 指针传递“似乎有效”并不能使它成为正确的做法。
事实证明,您可以将xmlNodePtr 转换为xmlDocPtr,反之亦然。
【讨论】:
xmlDocPtr 指针调用 xmlXPathNewContext(),而不是类型转换的子 xmlNodePtr 指针。
xmlDocPtr 访问children 列表,该列表存在于xmlDocPtr 和xmlNodePtr 中,内存中的相同偏移量。这就是它“起作用”的原因。但是xmlDocPtr 被传递给各种API 函数,这些函数确实需要一个真正的xmlDocPtr,并且API 明确指出xmlXPathNewContext() 需要一个xmlDocPtr,而不是一个类型转换的xmlNodePtr。你真的应该尊重 API 想要什么,而不是发生了什么。