1

我正在尝试在 C++ 中使用 RapidXML 解析 XML 文件,该文件类似于:

<root>
    <a>
        <b>1111</b>
        <c>
            <d1>2222</d1>       
            <d2>3333</d2>
        </c>
    </a>
</root>

要识别我正在做的父节点:

if (currentNode->first_node() != 0) { // this node has children, search for them }

它适用于前两个节点(根和 a),但是当我为节点“b”执行此操作时,它返回一个指向某处而不是 0 的指针,但“b”没有子节点。它不应该返回0吗?RapidXML 文档说:

函数 xml_node::first_node 概要

xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;

描述 获取第一个子节点,可选择匹配节点名称。

参数 name 要查找的孩子的名称,或 0 以返回第一个孩子,无论其名称如何;如果 name_size 不为零,则此字符串不必以零结尾

name_size 名称的大小,以字符为单位,或 0 以从字符串自动计算大小

case_sensitive 名称比较是否应该区分大小写;不区分大小写的比较仅适用于 ASCII 字符

返回 指向找到的孩子的指针,如果没有找到,则返回 0。

知道为什么会发生这种情况或我做错了什么吗?

谢谢

4

2 回答 2

1

您对 XML 的“元素节点”(即 root、a、b 等)和由解析器生成的 RapidXML 的“解析器节点”(包括数据节点)感到困惑。

您可以查看节点type()以确定它是否是数据节点,或者使用parse_no_data_nodes解析标志。

于 2013-03-04T14:18:20.737 回答
0

来自 Rapidxml 文档

   enum node_type
   ...
    Values

    node_document     A document node. Name and value are empty.
    node_element      An element node. Name contains element name.
                      Value contains text of first data node.
    node_data         A data node. Name is empty. Value contains data text.
    node_cdata        A CDATA node. Name is empty. Value contains data text.
    node_comment      A comment node. Name is empty. Value contains comment text.
    node_declaration  A declaration node. Name and value are empty. Declaration 
                      parameters (version, encoding and standalone) are 
                      in node attributes.
    node_doctype      A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
    node_pi           A PI node. Name contains target. Value contains instructions.

因此,正如 Roddy 所指出的,您应该检查“rapidXML”类型的节点。在你的例子中做类似的事情

    if (currentNode->first_node() != 0 && currentNode->type () == node_element) 
    { 
        // this node has children, search for them 
    }
于 2016-02-07T18:16:05.573 回答