我正在尝试创建XML签名机制。 我的XML可以是下面的内容:
<Main>
<ChildType1>... </ChildType1>
<ChildType2>... </ChildType2>
</Main>
实际上,对于Main
节点下面的数据类型,它是不可知的。
我只想在Main
节点上添加signature
属性后,将数据的CRC计算到Main
节点。
但是现在我写了
ostringstream ss;
{
boost::archive::text_oarchive oa(ss);
ss.str("");
try
{
TiXmlBase::SetCondenseWhiteSpace(false);
tinyxml::Document doc;
doc.LoadFile(filename.c_str());
tinyxml::Element* schemes = tinyxml::findSingleElement<SchemesSignatureException>(doc, "Main");
if (schemes == 0) throw logica_error("No Main found");
tinyxml::TinyXmlFwdIterator<tinyxml::Element> child;
for (child = child.begin(schemes); child != child.end(); ++child)
{
//the question is here, how to get the XML text of each child of the Main...
}
}
catch (exception& e)
{
throw ;
}
}
string data(ss.str());
boost::crc_32_type crc;
crc.process_bytes(data.data(), data.size());
当我遍历孩子时,我如何获得XML文本字符串,就像我的例子一样,第一次迭代将在oa
中刷新“...”并在{{1中“第二次迭代”...“ }
我试过GetText,但它总是返回NULL! 你知道吗?
答案 0 :(得分:1)
最后我发现重载<<
运算符并递归处理所有节点是正确的选项,
所以我使用以下代码深入到节点并转储到我想要的格式的输出流。我丢失了所有角度括号信号,但对我来说没问题。
std::ostream& operator << ( std::ostream & out, tinyxml::Node * pParent)
{
using namespace tinyxml;
if ( !pParent ) return out;
TiXmlText *pText;
TiXmlAttribute * pAttrib;
int t = pParent->Type();
switch ( t )
{
case TiXmlNode::TINYXML_DOCUMENT:
break;
case TiXmlNode::TINYXML_ELEMENT:
out << pParent->Value();
pAttrib = ((tinyxml::Element*)(pParent))->FirstAttribute();
while(pAttrib)
{
out << pAttrib->Name() << pAttrib->Value();
pAttrib = pAttrib->Next();
}
case TiXmlNode::TINYXML_COMMENT:
break;
case TiXmlNode::TINYXML_UNKNOWN:
break;
case TiXmlNode::TINYXML_TEXT:
pText = pParent->ToText();
out << pText->Value();
break;
case TiXmlNode::TINYXML_DECLARATION:
break;
default:
break;
}
/*out << endl;*/
TiXmlNode * pChild;
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
{
out << pChild;
}
return out;
}