在libxml2中使用XPath选择节点
我有一个类似于以下内容的XML文档在libxml2中使用XPath选择节点,xml,xpath,libxml2,vala,Xml,Xpath,Libxml2,Vala,我有一个类似于以下内容的XML文档 <library> <artist name="a"> <album name="1"></album> <album name="2"></album> </artist> <artist name="b"> <album name="8"></album> <album name="9">&
<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>`
此XPath查询仅返回艺术家a下的相册,即相册1和2。但是,context.eval(“/library/artist[@name=“b”]/album”)
正在返回艺术家b下的所有相册
上述代码的python等价物正在生成所需的结果
doc = libxml2.parseFile("data.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//album")
Vala代码有什么问题?首先,您应该通过检查
object->type==Xml.ObjectType.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"));
}
}
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"