Я хочу загрузить документы 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
?
Загрузить все данные из istream
а затем использовать TiXmlDocument::Parse
.
Я нашел ясное решение Вот:
Ввод в стиле C ++:
- основанный на std :: istream
- оператор >>
Читает XML из потока, что делает его полезным для передачи по сети.
Самое сложное — это знать, когда документ XML завершен, поскольку
почти наверняка будут другие данные в потоке. TinyXML будет
Предположим, что данные XML завершены после того, как они прочитали корневой элемент. Положил
другой способ, документы, которые плохо составлены с более чем одним
корневой элемент не будет читаться правильно. Также обратите внимание, что оператор >> is
несколько медленнее, чем Parse, из-за реализации STL и
ограничения TinyXML.
Пример:
std::istream *in = ResourceManager::getInstance().getResource(resourceName);
if(in) {
TiXmlDocument doc;
// load document from resource stream
*in >> doc;
}