如何从`std :: istream`加载XML文档?

时间:2012-09-09 10:55:32

标签: c++ std tinyxml

我想从std::istream加载TinyXml文档,但它不包含这样的方法:

/** Load a file using the current document value.
    Returns true if successful. Will delete any existing
    document data before loading.
*/
bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
/// Save a file using the current document value. Returns true if successful.
bool SaveFile() const;
/// Load a file using the given filename. Returns true if successful.
bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
/// Save a file using the given filename. Returns true if successful.
bool SaveFile( const char * filename ) const;
/** Load a file using the given FILE*. Returns true if successful. Note that this method
    doesn't stream - the entire object pointed at by the FILE*
    will be interpreted as an XML file. TinyXML doesn't stream in XML from the current
    file location. Streaming may be added in the future.
*/
bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );

我发现它包含使用FILE的函数,是否可以将std::istream转换为FILE

2 个答案:

答案 0 :(得分:1)

istream加载整个数据,然后使用TiXmlDocument::Parse

答案 1 :(得分:1)

我找到了明确的解决方案here

  

C ++样式输入:

     
      
  • 基于std :: istream
  •   
  • 运营商GT;>
  •   
     

从流中读取XML,使其对网络传输很有用。   棘手的部分是知道XML文档何时完成,因为   流中几乎肯定会有其他数据。 TinyXML会   假设读取根元素后XML数据已完成。放   另一种方式,文件构造不良,不止一个   root元素无法正确读取。另请注意运营商>>是   由于STL和STL的实现,它比Parse慢一些   TinyXML的局限性。

示例:

std::istream *in = ResourceManager::getInstance().getResource(resourceName);
if(in) {
   TiXmlDocument doc;
   // load document from resource stream
   *in >> doc;
}