TinyXml Parser отказывается загружать файл должным образом - PullRequest
2 голосов
/ 25 августа 2011

У меня есть следующий XML-файл:

<?xml version="1.0" ?>
<Hello>World</Hello>

Который находится в том же каталоге, что и все мои другие файлы.

И я использую этот метод исходного файла для его анализа:

void Character::assign_xml(const char * filename) //Assign xml takes the name of the xml file as a string, and uses it to parse the file's nodes.
{
    TiXmlDocument * doc = new TiXmlDocument(filename);

    bool loadOkay = doc->LoadFile(filename);



    if (loadOkay)
    {
        printf("\n%s\n", filename);
    }
    else
    {
        printf("%s does not work.", filename);
    }

    delete doc;

}

Тем не менее, когда я передаю ей строку, моя переменная loadOkay становится ложной. Почему это?

Мой вывод выдает следующее:

Starting /home/holland/code/qt/chronos-build-desktop/chronos...
id01.xml does not work.Failed to open file/home/holland/code/qt/chronos-build-desktop/chronos exited with code 0

Где в качестве strace обеспечивает:

futex(0x84579c, FUTEX_WAKE_PRIVATE, 2147483647) = 0
open("id01.xml", O_RDONLY)              = -1 ENOENT (No such file or directory)
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773e000
write(1, "id01.xml does not work.Failed to"..., 42id01.xml does not work.Failed to open file) = 42

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Не следует передавать имя файла как конструктору документа, так и LoadFile(). Попробуйте опустить его из последнего, как в примерах на сайте TinyXML.

Если это все еще не работает, распечатайте doc->ErrorDesc() (и, возможно, ErrorRow и ErrorCol).

И прочитайте документацию: http://www.grinninglizard.com/tinyxmldocs/classTiXmlDocument.html

0 голосов
/ 13 марта 2014

Вот небольшой пример использования TinyXML для анализа на этой странице: Пример Tiny XML Parser

Вот пример с крошечными модификациями:

#include "tinyxml.h" 

#include <iostream>
#include <string>
using namespace std; 

void Parcours( TiXmlNode* node, int level = 0 )
{
    cout << string( level*3, ' ' ) << "[" << node->Value() << "]";
    if ( node->ToElement() )
    {
        TiXmlElement* elem = node->ToElement();
        for ( const TiXmlAttribute* attr = elem->FirstAttribute(); attr; attr = attr->Next() )
            cout << " (" << attr->Name() << "=" << attr->Value() << ")";
    }
    cout << "\n";     

    for( TiXmlNode* elem = node->FirstChild(); elem; elem = elem->NextSibling() )
        Parcours( elem, level + 1 );
} 

int main( int argc, char* argv[] )
{
    TiXmlDocument doc("C:/test.xml" );
    bool loadOkay = doc.LoadFile();
    if ( !loadOkay ) {
        cerr << "Could not load test file. Error='" << doc.ErrorDesc() << "'. Exiting.\n";
        return 1;
    } 
    Parcours( doc.RootElement() );
}

Вы можете попробовать это с вашим XML-файлом(это работает для меня) или XML-документ, как это:

<Parent>
    <Child1 test="program" />    
    <Child2>
        <Node number="123456789" />      
    </Child2>
    <Child3>        
        <Hello World="!!!" />
    </Child3>    
</Parent>
...