运行于: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;
}