提问人:TraceTalcum 提问时间:8/27/2023 更新时间:8/28/2023 访问量:32
如何使用 libxml2 访问 xml 文件中的特定元素?
How do I access a specific element in an xml file with libxml2?
问:
我需要一个指向此文件的“tiles”元素的 xmlNode。
<map>
<export from="v4.3.9" build="4390" date="2023-07-17" time="14:55:14" />
<region floors="1" lowest_floor="1" grid_shape="square">
<name>
<![CDATA[Region 1]]>
</name>
<setup origin="bl" />
<floor index="1">
<tiles>
...
我想我可以通过将 xmlNode 设置为其子级来简单地向下导航树。
xmlDoc *doc;
xmlNode *cur;
doc = xmlParseFile("test.xml");
cur = xmlDocGetRootElement(doc);
cur = cur->children; // cur->name at this point returns 'text' which is weird but besides the point
cur = cur->next;
...
在这一点上,cur 是“导出”,这是我所期望的。但是如果我再做一次,cur 变为 NULL,我得到一个段错误。我可以再次执行 cur = cur->next 来到达“区域”,但我也无法从那里到达任何地方。我以为每个节点都会连接到下一个节点,但事实似乎并非如此,它在第一组子节点之后停止。
答:
0赞
Jason Viers
8/28/2023
#1
此时 cur->name 返回“text”,这很奇怪,但除此之外
这是因为节点之间的空格很重要,即使我们通常不这么认为。
该节点是换行符和 和 之间的两个空格。text
<map>
<export>
我以为每个节点都会连接到下一个节点,但事实似乎并非如此,它在第一组子节点之后停止。
这是因为 DOM 是分层的,而不是线性的。当你打开时,你可以进入它,并继续检查,直到你到达,等等......<region>
node->children
node->next
<floor>
或者,您可以使用 XPath 并只执行 的 XPath 查询,它将为您提供 tiles 节点。map/region/floor/tiles
在 libxml2 示例列表中有一个使用 XPath 的示例
http://xmlsoft.org/examples/#xpath1.c
评论
0赞
TraceTalcum
8/29/2023
谢谢。换行符节点的解释真的很有帮助,在此之前,我根本无法理解 xmlNode 的工作。
评论