Как загрузить XML-документ из `std::istream`?

Я хочу загрузить документы TinyXml из std::istream, но он не содержит такой метод:

/** 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 ответа

Решение

Я нашел ясное решение здесь:

Ввод в стиле C++:

  • основанный на std::istream
  • оператор >>

Читает XML из потока, что делает его полезным для передачи по сети. Самое сложное - это знать, когда документ XML завершен, поскольку в потоке почти наверняка будут другие данные. TinyXML будет считать, что данные XML завершены после чтения корневого элемента. Другими словами, документы, которые неправильно составлены с более чем одним корневым элементом, не будут правильно читаться. Также обратите внимание, что оператор >> несколько медленнее, чем Parse, из-за реализации STL и ограничений TinyXML.

Пример:

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

Загрузить все данные из istream а затем использовать TiXmlDocument::Parse,

Другие вопросы по тегам