使用 RapidXML 解析 XML 文件时获取重复的节点值
Getting duplicate node values when parsing XML file using RapidXML
我需要使用 RapidXML 读取一个简单的 XML 文件。我已将 XML 文件加载到字符串变量中并将其传递给解析器。我需要获取所有节点名称和值(如果存在)。
我的问题是以下值最终重复:
- stepID->值
- steppHeading1->值
- stepText->值
这是描述问题的图片:
如果 stepID、stepmHeading1 和 stepText 节点没有任何子节点,为什么我的代码会给我所有这些重复的值?另外,当节点值变成那样时,为什么代码不给我重复的节点名称?
------------ XML 下面的文件------------
<?xml version="1.0" encoding="UTF-8"?>
<game>
<step>
<stepID>Name</stepID>
<stepHeading1>Title1</stepHeading1>
<stepHeading2></stepHeading2>
<stepHeading3></stepHeading3>
<stepHeading4></stepHeading4>
<stepHeading5></stepHeading5>
<stepHeading6></stepHeading6>
<stepText>First Step First Step First Step </stepText>
<link>
<linkStepID>First Link Name</linkStepID>
<linkText>First Link Text</linkText>
</link>
</step>
</game>
------------ 下面的代码------------
xml_document<>doc;
doc.parse<0>(&( dataForParser1.getLoadedXMLfile() )[0]);
xml_node<> *rootNode = doc.first_node();
xml_node <> *pStep = 0;
xml_node <> *pDiff = 0;
xml_node <> *pLink = 0;
for (xml_node <> *pStep = rootNode->first_node("step"); pStep; pStep = pStep->next_sibling())
{
cout << pStep->name() << " " << pStep->value() << endl;
for (xml_node <> *pDiff = pStep->first_node(); pDiff; pDiff = pDiff->next_sibling())
{
cout << pDiff->name() << " " << pDiff->value() << endl;
for (xml_node <> *pLink = pDiff->first_node(); pLink; pLink = pLink->next_sibling())
{
cout << pLink->name() << " " << pLink->value() << endl;
}
}
cout << endl << endl;
}
您遇到的问题是由于您应用到 parse
方法的标志:
doc.parse<0>(&( dataForParser1.getLoadedXMLfile() )[0]);
此处使用0时,节点数据将被转换为单独的子节点。
尝试使用 parse<1>
代替,数据应该保留在父节点中。
可以在 rapidxml.hpp
文件中找到此信息,以及其他标志:
//! Parse flag instructing the parser to not create data nodes.
//! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified.
//! Can be combined with other flags by use of | operator.
//! <br><br>
//! See xml_document::parse() function.
const int parse_no_data_nodes = 0x1;
我需要使用 RapidXML 读取一个简单的 XML 文件。我已将 XML 文件加载到字符串变量中并将其传递给解析器。我需要获取所有节点名称和值(如果存在)。 我的问题是以下值最终重复:
- stepID->值
- steppHeading1->值
- stepText->值
这是描述问题的图片:
如果 stepID、stepmHeading1 和 stepText 节点没有任何子节点,为什么我的代码会给我所有这些重复的值?另外,当节点值变成那样时,为什么代码不给我重复的节点名称?
------------ XML 下面的文件------------
<?xml version="1.0" encoding="UTF-8"?>
<game>
<step>
<stepID>Name</stepID>
<stepHeading1>Title1</stepHeading1>
<stepHeading2></stepHeading2>
<stepHeading3></stepHeading3>
<stepHeading4></stepHeading4>
<stepHeading5></stepHeading5>
<stepHeading6></stepHeading6>
<stepText>First Step First Step First Step </stepText>
<link>
<linkStepID>First Link Name</linkStepID>
<linkText>First Link Text</linkText>
</link>
</step>
</game>
------------ 下面的代码------------
xml_document<>doc;
doc.parse<0>(&( dataForParser1.getLoadedXMLfile() )[0]);
xml_node<> *rootNode = doc.first_node();
xml_node <> *pStep = 0;
xml_node <> *pDiff = 0;
xml_node <> *pLink = 0;
for (xml_node <> *pStep = rootNode->first_node("step"); pStep; pStep = pStep->next_sibling())
{
cout << pStep->name() << " " << pStep->value() << endl;
for (xml_node <> *pDiff = pStep->first_node(); pDiff; pDiff = pDiff->next_sibling())
{
cout << pDiff->name() << " " << pDiff->value() << endl;
for (xml_node <> *pLink = pDiff->first_node(); pLink; pLink = pLink->next_sibling())
{
cout << pLink->name() << " " << pLink->value() << endl;
}
}
cout << endl << endl;
}
您遇到的问题是由于您应用到 parse
方法的标志:
doc.parse<0>(&( dataForParser1.getLoadedXMLfile() )[0]);
此处使用0时,节点数据将被转换为单独的子节点。
尝试使用 parse<1>
代替,数据应该保留在父节点中。
可以在 rapidxml.hpp
文件中找到此信息,以及其他标志:
//! Parse flag instructing the parser to not create data nodes.
//! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified.
//! Can be combined with other flags by use of | operator.
//! <br><br>
//! See xml_document::parse() function.
const int parse_no_data_nodes = 0x1;