【问题标题】:libxml2: xpath from xmlNodelibxml2:来自 xmlNode 的 xpath
【发布时间】:2011-09-12 02:11:29
【问题描述】:

我查看了文档,看来您只能通过创建 xpath contextxmlDocPtr 执行 xpath 搜索。 libxml2 中是否有从xmlNodePtr 进行 xpath 搜索的方法?

【问题讨论】:

    标签: c xml libxml2


    【解决方案1】:

    调用xmlXPathNewContext(),为文档指定真正的顶级xmlDocPtr,然后将xmlXPathContext::node字段设置为所需的xmlNodePtr指针,该指针是xmlDocPtr文档的子级。

    【讨论】:

    • 我正在我的代码中进行强制转换,它似乎工作正常。使用 xmlXPathNewContext 是推荐的方法吗?似乎不需要。 xmlXPathContextPtr xpContext = xmlXPathNewContext((xmlDocPtr)node);
    • 查看 libxml2 源代码,它期望 xmlDocPtr 参数指向一个真实的 xmlDoc 对象。它作为各种 API 调用的 xmlDocPtr 参数在内部传递。 xmlXPathContext 有一个单独的 node 字段,用于跟踪正在处理的实际文档子 xmlNodePtr。仅仅因为将 xmlNodePtr 指针作为类型转换的 xmlDocPtr 指针传递“似乎有效”并不能使它成为正确的做法。
    【解决方案2】:

    事实证明,您可以将xmlNodePtr 转换为xmlDocPtr,反之亦然。

    【讨论】:

    • libxml2 要求使用真正的顶级 xmlDocPtr 指针调用 xmlXPathNewContext(),而不是类型转换的子 xmlNodePtr 指针。
    • 嗯,我正在做演员表,它似乎没有任何问题。没有内存泄漏或数据损坏。该应用程序现在已经下载了 1000 多次,并且没有关于通过 xml 解析器运行的数据的投诉。此应用的 xpath 代码是开源的:github.com/kgn/KGLib/blob/master/Shared/KGXPath.m
    • 我支持我早期的 cmets。 XPath 本身正在从指定的xmlDocPtr 访问children 列表,该列表存在于xmlDocPtrxmlNodePtr 中,内存中的相同偏移量。这就是它“起作用”的原因。但是xmlDocPtr 被传递给各种API 函数,这些函数确实需要一个真正的xmlDocPtr,并且API 明确指出xmlXPathNewContext() 需要一个xmlDocPtr,而不是一个类型转换的xmlNodePtr。你真的应该尊重 API 想要什么,而不是发生了什么。
    • 我尝试了这种方式,它似乎在为每个后续查询重用第一个查询中的数据。这张图片显示了我的原始代码和设置节点的新代码,以及我的应用程序中生成的数据视图:cl.ly/D7vY您是否发现我在实施您的建议时有什么明显的错误会导致数据被重用?跨度>
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多