gpt4 book ai didi

xml - 在 libxml2 中使用 XPath 选择节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:41:02 24 4
gpt4 key购买 nike

我有一个类似于下面的 XML 文档。

<library>
<artist name="a">
<album name="1"></album>
<album name="2"></album>
</artist>
<artist name="b">
<album name="8"></album>
<album name="9"></album>
</artist>
</library>`

我正在 Ubuntu 上的 Vala 中编写一个应用程序,并使用 libxml2 库来操作 XML 文档。我想获取所有 album 节点,而不考虑它们在文档中的位置。我编写了以下代码来完成上述工作。

document = Xml.Parser.parse_file (PATH_TO_DB);
...
Xml.XPath.Context context;
unowned Xml.XPath.Object *object;

context = new Xml.XPath.Context(document);
object = context.eval("//album");

if(object->nodesetval->is_empty())
return null;

return object->nodesetval->item(0);
...

此 XPath 查询仅返回艺术家 a 下的专辑,即专辑 1 和 2。但是,context.eval("/library/artist[@name="b"]/album"); 正在返回 artist b 下的所有专辑。

上面显示的代码的 python 等价物正在产生所需的结果。

doc = libxml2.parseFile("data.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//album")

Vala 代码有什么问题?

最佳答案

首先,您应该通过检查 object->type == Xml.ObjectType.NODESET 来检查返回的对象是否为 NodeSet。

接下来,您只返回结果节点集中的第一项。有 nodeset->length() 项。

void main() {
var document = Xml.Parser.parse_file ("file.xml");
run_query("//album", document);
run_query("/library/artist[@name=\"b\"]/album", document);
}

void run_query(string query, Xml.Doc* document) {
stdout.printf("Query: %s\n", query);
Xml.XPath.Context context;
unowned Xml.XPath.Object *object;

context = new Xml.XPath.Context(document);
object = context.eval(query);
assert(object->type == Xml.XPath.ObjectType.NODESET);

if(object->nodesetval->is_empty()) {
stdout.printf("empty");
return;
}

for (var i = 0; i < object->nodesetval->length(); i++) {
var node = object->nodesetval->item(i);
stdout.printf("node %s name=\"%s\"\n", node->name, node->get_prop("name"));
}
}

产生:

Query: //album
node album name="1"
node album name="2"
node album name="8"
node album name="9"
Query: /library/artist[@name="b"]/album
node album name="8"
node album name="9"

关于xml - 在 libxml2 中使用 XPath 选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com