首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本形式的TinyXML元素提取

文本形式的TinyXML元素提取
EN

Stack Overflow用户
提问于 2014-02-18 21:41:47
回答 1查看 1K关注 0票数 0

我正在尝试创建一个XML签名机制。我的XML可能如下所示:

代码语言:javascript
运行
复制
<Main>
   <ChildType1>... </ChildType1>
   <ChildType2>... </ChildType2>
</Main>

事实上,它对于Main节点下的数据类型是不可知的。我只想计算包含在Main节点中的数据以及在Main上添加signature属性后的CRC值。

但现在我写道

代码语言:javascript
运行
复制
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和第二次迭代中"...“在oa

我尝试过GetText,但总是返回NULL!你有主意吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-19 00:19:35

最后,我发现重载<<操作符并递归地对待所有节点是一个正确的选择,因此我使用以下代码向下钻取到该节点,并以我想要的格式将其转储到输出流中。我失去了所有的尖括号信号,但这对我来说很好。

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21855659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档