0

我呼吁您,因为我在使用未考虑 xpath 表达式中某些参数的 libxml2 库时遇到问题。

这是我尝试解析的 xml 文件的示例:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

    <book title="Harry Potter" lang="eng" version="1">
       <price>29.99</price>
    </book>

    <book title="Learning XML" lang="eng" version="2">
        <price>38.95</price>
    </book>

    <book title="Learning C" lang="eng" version="2">  
       <price>39.95</price>
    </book>

</bookstore>

假设我想提取所有母语为英语且版本为第一版的书籍。

如果我没记错以下 XPath 表达式,我将使用:

//book[@lang='eng' and @version='1']

以及我的代码中的以下说明:

xmlChar * xpath_expression = "//book[@lang='eng' and @version='1']";
xmlXPathObjectPtr xpathRes = xmlXPathEvalExpression(xpath_expression, ctxt);

问题是我得到的结果是书籍列表,好像我只是执行以下请求:

//book

我想知道我的版本是否有问题,因为我知道我的 debian 挤压(2.7.8.dfsg-2 +挤压7)是最新的......

4

1 回答 1

0

这肯定不是 libxml2 中的错误。您可能在其他地方犯了错误。以下代码仅打印“哈利波特”:

#include <stdio.h>
#include <libxml/xpath.h>

int main()
{
    static const char xml[] =
        "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
        "<bookstore>\n"
        "    <book title=\"Harry Potter\" lang=\"eng\" version=\"1\">\n"
        "       <price>29.99</price>\n"
        "    </book>\n"
        "    <book title=\"Learning XML\" lang=\"eng\" version=\"2\">\n"
        "        <price>38.95</price>\n"
        "    </book>\n"
        "    <book title=\"Learning C\" lang=\"eng\" version=\"2\">  \n"
        "       <price>39.95</price>\n"
        "    </book>\n"
        "</bookstore>\n";

    xmlDocPtr doc = xmlParseMemory(xml, sizeof(xml));
    xmlXPathContextPtr ctxt = xmlXPathNewContext(doc);
    xmlChar *expression = BAD_CAST "//book[@lang='eng' and @version='1']";
    xmlXPathObjectPtr res = xmlXPathEvalExpression(expression, ctxt);
    xmlNodeSetPtr nodeset = res->nodesetval;

    for (int i = 0; i < nodeset->nodeNr; i++) {
        xmlNodePtr node = nodeset->nodeTab[i];
        xmlChar *title = xmlGetProp(node, BAD_CAST "title");
        printf("%s\n", title);
    }   

    xmlXPathFreeObject(res);
    xmlXPathFreeContext(ctxt);
    xmlFreeDoc(doc);

    return 0;
}
于 2013-06-20T19:30:16.313 回答