为什么tinyxml的FirstAttribute()在简单函数中返回null?



运行于:Linux Mint 16,QtCreator 3.0.0和Qt 5.2.0。 tinyXML 最新版本。

XML 使用:

<users>
<user>
    <username>testadmin</username>
    <password>testpwd</password>
    <privileges>2</privileges>
</user>
<user>
    <username>testuser</username>
    <password>testpwd</password>
    <privileges>1</privileges>
</user>

不起作用的代码:

void Server::loadUsersFile()
{
TiXmlDocument usersDoc("users.xml");
    bool loadOk = usersDoc.LoadFile();
    if(!loadOk) {
        cout << "Error opening users file" << endl;
        return;
    }
    TiXmlElement* rootChild = usersDoc.FirstChildElement("users");
    TiXmlElement* userChild = rootChild->FirstChildElement("user");
    TiXmlAttribute* pAttrib=userChild->FirstAttribute();
    cout << pAttrib->Name();
}

pAttrib 是空的,我不明白为什么。也许我没有获得子/属性关系。感谢帮助。

您的第一个user元素没有任何属性。属性是在元素的开始标记中定义的数据,因此要使user元素具有属性,它必须看起来像

<user type="posix">
...
</user>

其中type="posix"user元素的属性。

要获取元素中的username元素,也许您需要

TiXmlElement* username = userChild->FirstChildElement();

或更安全

TiXmlElement* username = userChild->FirstChildElement("username");

您的 XML 没有任何属性。它在元素中具有文本,但没有属性

如果您的 XML 具有类似以下内容:

<user name="foo" />

然后它会给你一个属性。当然,您可以拥有多个属性:

<user username="testadmin" password="testpassword" privileges="2" />

您可以更改代码,也可以更改 XML 以使用属性。例如,如果您这样做,我建议您询问特定属性,而不是要求用户名是第一个属性。

如果你打算使用 XML,了解术语很重要,否则你会感到非常困惑。在进一步讨论之前,可能值得浏览一下 XML 教程。

我决定坚持使用"elments内部的文本"版本,因为它似乎更容易阅读。感谢您的帮助!因此,代码是:

void Server::loadUsersFile()
{
    cout << "Loading users list..."<<endl;
    TiXmlDocument usersDoc(this->fileUsersStr);
    bool loadOk = usersDoc.LoadFile();
    if(!loadOk) {
        cout << "Error opening users file" << endl;
        return;
    }
    TiXmlElement* rootChild = usersDoc.FirstChildElement("users");
    TiXmlElement* userChild = rootChild->FirstChildElement("user");
    TiXmlElement *usernameElem;
    TiXmlElement *passwordElem;
    TiXmlElement *privilegesElem;
    while(userChild)
    {
        usernameElem = userChild->FirstChildElement("username");
        passwordElem = userChild->FirstChildElement("password");
        privilegesElem = userChild->FirstChildElement("privileges");
        cout << "username: " << usernameElem->GetText() << endl;
        cout << "password: " << passwordElem->GetText() << endl;
        cout << "privilege:" << atoi(privilegesElem->GetText()) << endl;
        userChild = userChild->NextSiblingElement();
    }
    cout << "Finished loading."<<endl;
}

相关内容

  • 没有找到相关文章

最新更新