如何使用 libxml2 访问 xml 文件中的特定元素?

How do I access a specific element in an xml file with libxml2?

提问人:TraceTalcum 提问时间:8/27/2023 更新时间:8/28/2023 访问量:32

问:

我需要一个指向此文件的“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 来到达“区域”,但我也无法从那里到达任何地方。我以为每个节点都会连接到下一个节点,但事实似乎并非如此,它在第一组子节点之后停止。

C XML libxml2

评论


答:

0赞 Jason Viers 8/28/2023 #1

此时 cur->name 返回“text”,这很奇怪,但除此之外

这是因为节点之间的空格很重要,即使我们通常不这么认为。

该节点是换行符和 和 之间的两个空格。text<map><export>


我以为每个节点都会连接到下一个节点,但事实似乎并非如此,它在第一组子节点之后停止。

这是因为 DOM 是分层的,而不是线性的。当你打开时,你可以进入它,并继续检查,直到你到达,等等......<region>node->childrennode->next<floor>


或者,您可以使用 XPath 并只执行 的 XPath 查询,它将为您提供 tiles 节点。map/region/floor/tiles

在 libxml2 示例列表中有一个使用 XPath 的示例

http://xmlsoft.org/examples/#xpath1.c

评论

0赞 TraceTalcum 8/29/2023
谢谢。换行符节点的解释真的很有帮助,在此之前,我根本无法理解 xmlNode 的工作。