我正在尝试使用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 }
它适用于两个第一个节点(root和a),但是当我为节点'b'执行此操作时,它返回指向某处而不是0的指针,但是'b'没有子节点。它不应该返回0吗? RapidXML文档说:
function xml_node :: first_node 概要
xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;
描述 获取第一个子节点,可选地匹配节点名称。
参数 名称 要找的孩子的名字,或者0,不管名字如何都要归还第一个孩子;如果name_size为非零
,则此字符串不必为零终止NAME_SIZE 名称大小,以字符为单位,或0表示从字符串
自动计算大小CASE_SENSITIVE 名称比较应区分大小写;非区分大小写的比较仅适用于ASCII字符
返回 找到孩子的指针,如果没有找到则为0。
知道为什么会这样或者我做错了什么?
由于
答案 0 :(得分:1)
您对XML'元素节点'(即root,a,b等)和RapidXML的“解析器节点”(由解析器生成)(包括数据节点)感到困惑。
您可以查看节点的type()
以确定它是否是数据节点,或使用parse_no_data_nodes
解析标记。
答案 1 :(得分: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.
正如罗迪指出的那样,你应该检查&#34; rapidXML&#34;节点类型。在您的示例中执行类似
的操作 if (currentNode->first_node() != 0 && currentNode->type () == node_element)
{
// this node has children, search for them
}