rapidxml第一个节点不';t返回空值 我尝试用C++中的RAPIDXML解析XML文件,文件如下: <root> <a> <b>1111</b> <c> <d1>2222</d1> <d2>3333</d2> </c> </a> </root>

rapidxml第一个节点不';t返回空值 我尝试用C++中的RAPIDXML解析XML文件,文件如下: <root> <a> <b>1111</b> <c> <d1>2222</d1> <d2>3333</d2> </c> </a> </root>,c++,xml,null,rapidxml,C++,Xml,Null,Rapidxml,它对前两个节点(根节点和a节点)运行良好,但当我对节点“b”执行此操作时,它返回指向某个位置的指针,而不是0,但“b”没有子节点。它不应该返回0吗?RapidXML文档说明: 函数xml\u节点::第一个\u节点 简介 xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; xml\u节点*第一个节点(const Ch*name=0,st

它对前两个节点(根节点和a节点)运行良好,但当我对节点“b”执行此操作时,它返回指向某个位置的指针,而不是0,但“b”没有子节点。它不应该返回0吗?RapidXML文档说明:

函数xml\u节点::第一个\u节点 简介

xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;
xml\u节点*第一个节点(const Ch*name=0,std::size\t name\u size=0,bool case\u sensitive=true)常量;
说明 获取第一个子节点,可以选择匹配节点名称

参数 名称 要查找的子项的名称,或0返回第一个子项,而不考虑其名称;如果name_size为非零,则此字符串不必以零结尾

名称\u大小 名称的大小(以字符为单位)或0,以便根据字符串自动计算大小

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

返回 指向找到的子项的指针,如果未找到,则指向0

你知道为什么会这样,或者我做错了什么吗


谢谢

您混淆了XML“元素节点”(即根、a、b等)和由解析器生成的RapidXML“解析器节点”(包括数据节点)


您可以查看节点以确定它是否是数据节点,也可以使用解析标志。

您混淆了XML“元素节点”(即根、a、b等)和由解析器生成的RapidXML“解析器节点”(包括数据节点)


您可以查看节点的以确定它是否是数据节点,也可以使用解析标志。

来自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 
    }

来自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 
    }

我知道在其他XML实现中,节点的值本身就是一个“值”节点。ie:b有一个子节点,即值1111。不确定RapidXML是否是相同的实现。谢谢Ryan,既然您提到了这一点,我尝试读取节点的值。节点b的值是1111,1111也被标识为b的子节点,这个子节点的值也是1111,尽管它没有名称,但这是正确的。我知道在其他XML实现中,节点的值将是“值”节点本身。ie:b有一个子节点,即值1111。不确定RapidXML是否是相同的实现。谢谢Ryan,既然您提到了这一点,我尝试读取节点的值。节点b的值为1111,1111也被标识为b的子节点,该子节点的值也为1111,尽管它没有名称,但什么是正确的。