XML 用于存储数据,数据的形式类似于树结构(参考: http://www.runoob.com/xml/)

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <note>
  3.   <to>George</to>
  4.   <from>John</from>
  5.   <heading>Reminder</heading>
  6.   <body>Don't forget the meeting!</body>
  7. </note>

其中第一行是XML声明,定义XML版本(1.0)以及所使用的编码格式

接下来的<note>,便是该文档的根元素

剩下的<to>,<from>,<heading>,<body>便是<note>的子元素

 

比如这样会产生 XML 错误:

  1. <message>if salary < 1000 then</message>

 

为了避免这个错误,请用实体引用来代替 “<“ 字符:

  1. <message>if salary &lt; 1000 then</message>

 

属性必须被引号包围,比如:

  1. <person sex="female">
  2. <firstname>Anna</firstname>
  3. <lastname>Smith</lastname>
  4. </person>

 

上面的female便是属性,其中sex便是命名空间

注意:需要避免使用属性,如果信息感觉起来很像数据,那么请使用元素吧。

比如:

  1. <person>
  2. <sex>female</sex>
  3. <firstname>Anna</firstname>
  4. <lastname>Smith</lastname>
  5. </person>

 

XML 命名空间属性被放置于元素的开始标签之中

它的作用是将多个相同的元素区别开来,比如:

  1. <entry term="of pictures">
  2. <page>115</page>
  3. <page>244</page>
  4. </entry>

  5. <entry term="of vectors">
  6. <page>9</page>
  7. </entry>

 

 

 常用函数:

  1. QStringRef documentEncoding(); //获取XML编码,如果XML声明中未指定,则返回NULL
  2. QStringRef documentVersion () ; //获取XML版本,如果XML声明中未指定,则返回NULL
  3. bool atEnd ();
  4. //如果读者一直读到XML文档的末尾,或者出现了错误,并且阅读被中止,那么返回true。否则,它将返回false。
  5. //读取XML内容,如果读到XML末尾,或者读取出错时,将返回true,否则返回false
  6. //当返回true时,可以通过error()判断是否读取出错
  7. Error error () ; //返回错误类型,如果未出错,将返回QXmlStreamReader::NoError(数值0)
  8. void raiseError ( constQString & message = QString() );
  9. //主动上报错误,并填入message 错误信息(可以通过errorString()获取),可以使得下次调用atEnd()时,直接返回true值
  10. QString errorString();
  11. //获取发生的错误信息
  12. void QXmlStreamReader::setDevice ( QIODevice *device );
  13. //设置QXmlStreamReader的解析设备,等价于QXmlStreamReader ( QIODevice *)构造函数
  14. TokenType readNext(); //读取一次记号,并返回该数据的标志位,也可以通过
  15. //常用标记如下所示:
  16. QXmlStreamReader::StartDocument //文档开始位置,用来定义XML版本,编码等信息,
  17. QXmlStreamReader::StartElement //元素开始位置
  18. QXmlStreamReader::EndElement //元素结束位置
  19. //比如<firstname>Anna</firstname>
  20. //<firstname> </firstname>元素便是元素开始以及结束位置.
  21. //“Anna”信息可以通过readElementText()成员函数获取.
  22. QXmlStreamAttributes attributes(); //获取命名空间属性
  23. //比如<entry term="of pictures">
  24. //通过attributes().value("term").toString()则可以得到"of pictures"

 

 

 

 

XML解析示例

以解析G:/QT/in.xml为例,该文件内容如下所示:

  1. <?xml version="1.0"?>
  2. <bookindex>
  3. <entry term="sidebearings">
  4. <page>10</page>
  5. <page>34-35</page>
  6. <page>307-308</page>
  7. </entry>
  8.  
  9. <entry term="subtraction">
  10. <entry term="of pictures">
  11. <page>115</page>
  12. <page>244</page>
  13. </entry>
  14.  
  15. <entry term="of vectors">
  16. <page>9</page>
  17. </entry>
  18.  
  19. </entry>
  20. </bookindex>

 

代码如下所示:

  1. #include <QtGui>
  2. void ParseEntry(QXmlStreamReader* reader,QTreeWidgetItem* widget) //递归函数,用来解析entry元素
  3. {
  4. QTreeWidgetItem *item =new QTreeWidgetItem(widget); //在widget下创建节点
  5. item->setText(0,reader->attributes().value("term").toString());
  6. //获取entry元素的"term"值,并添加到第1列,比如"sidebearings"
  7. QString pages;
  8. while(!reader->atEnd())
  9. {
  10. QXmlStreamReader::TokenType type=reader->readNext();
  11. if(type==QXmlStreamReader::EndElement && reader->name()=="entry") //如果遇到 </entry>,则表示解析完成
  12. {
  13. break;
  14. }
  15. if(type==QXmlStreamReader::StartElement)
  16. {
  17. if(reader->name()=="entry")
  18. ParseEntry(reader,item); //如果是entry子元素,则继续递归执行
  19. else if(reader->name()=="page")
  20. pages=pages+reader->readElementText()+" "; //如果是page,则获取文本信息
  21. else
  22. reader->raiseError("Element Name Error "); //是其它元素,则上报Error信息
  23. }
  24. }
  25. item->setText(1,pages); //添加页数到第二列
  26. }
  27. void readFile(QFile* File)
  28. {
  29. QXmlStreamReader* reader = new QXmlStreamReader(File);
  30. QTreeWidget* widget = new QTreeWidget();
  31. QStringList header;
  32. header<<"term"<<"page";
  33. widget->setHeaderLabels(header);
  34. while(!reader->atEnd())
  35. {
  36. QXmlStreamReader::TokenType type=reader->readNext();
  37. if(type==QXmlStreamReader::StartElement && reader->name()=="entry")
  38. ParseEntry(reader,widget->invisibleRootItem()); //开始解析"entry"元素里的内容
  39. }
  40. File->close();
  41. widget->show();
  42. if(reader->hasError()) //如果解析出错
  43. {
  44. QMessageBox::information(NULL,"Read","Read :"+reader->errorString());
  45. }
  46. }
  47. int main(int argc, char *argv[])
  48. {
  49. QApplication a(argc,argv);
  50. QFile* File = new QFile("G:/QT/in.xml");
  51. if(!File->open(QFile::ReadOnly | QFile::Text))
  52. {
  53. QMessageBox::information(NULL,"Open","Open error!");
  54. return 0;
  55. }
  56. readFile(File); //解析File
  57. a.exec();
  58. }

效果:

 

 

版权声明:本文为lifexy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lifexy/p/9111740.html