qt解析qt qdomdocumentttagname怎么获取值

Qt解析XML文件(QDomDocument)
Qt解析XML文件(QDomDocument)
void ParseXML::parse(QString file_name)
& & if(file_name.isEmpty())
& & QFile file(file_name);
if(!file.open(QFile::ReadOnly | QFile::Text))
& QMessageBox::information(NULL, QString("title"),
QString("open error!"));
& & int row = 0, column = 0;
if(!document.setContent(&file, false, &error, &row,
& QMessageBox::information(NULL, QString("title"),
QString("parse file failed at line row and column") +
QString::number(row, 10) + QString(",") + QString::number(column,
if(document.isNull())
& QMessageBox::information(NULL, QString("title"),
QString("document is null!"));
& & QDomElement root =
document.documentElement(); &
//root_tag_name为persons
& & QString root_tag_name =
root.tagName();
if(root.hasAttribute("name"))
& //name为Qt
& QString name =
root.attributeNode("name").value();&
& & //获取id="1"的节点
& & QDomElement person =
root.firstChildElement(); &
if(person.isNull())&
& & QString person_tag_name
= person.tagName();
& & //id为1
& & QString id =
person.attributeNode("id").value();
& & //获取子节点,数目为2
& & QDomNodeList list =
root.childNodes();
& & int count =
list.count();
& & for(int i=0; i
& QDomNode dom_node = list.item(i);
& QDomElement element =
dom_node.toElement();
& //获取id值,等价
& QString id_1 =
element.attributeNode("id").value();&
& QString id_2 = element.attribute("id");
& //获取子节点,数目为4,包括:name、age、email、website
& QDomNodeList child_list =
element.childNodes();
& int child_count = child_list.count();
& for(int j=0; j
& & & QDomNode
child_dom_node = child_list.item(j);
QDomElement child_element = child_dom_node.toElement();
& & & QString
child_tag_name = child_element.tagName();
& & & QString
child__tag_value = child_element.text();
//按照name、age、email、website的顺序获取值
& & QDomElement element =
person.firstChildElement(); &
while(!element.isNull())
& QString tag_name = element.tagName();
& QString tag_value = element.text();
& element = element.nextSiblingElement();
&&技术在于交流、沟通,转载请注明出处并保持作品的完整性。
&&作者:&&原文:。
发表评论:
TA的最新馆藏[转]&Qt操作xml引发内部异常(Qt5Xml.lib和Qt5Xmld.lib)
在VS2012中使用QT5.1,加载QtXml来操作xml档。可是出了一个很奇怪的问题。下面是实现代码
#include &XmlTest.h&
#include &QtDebug&
void XmlTest::write()
QDomElement d=document.createElement(&document&);
d.setAttribute(&name&,&DocName&);
QDomElement a=document.createElement(&author&);
a.setAttribute(&name&,&AuthorName&);
QDomText text=document.createTextNode(&Some text&);
document.appendChild(d);
d.appendChild(a);
d.appendChild(text);
QFile file(&simple.xml&);
if (!file.open(QIODevice::WriteOnly|QIODevice::Text))
qDebug(&Failed to open file for writing.&);
QTextStream stream(&file);
stream&&document.toString();
file.close();
}在编译时,出现以下错误
看错误的提示,是QDomNode、QDomDocument等出了问题。这种情况,一般有两种情况,一种是只在头文件中定义了相应的方法,而没有去实现。另一种是调用库,但没有链接到lib中。
QtXml是QT提供的库,所以原因应该是没有链接到lib中所致。于是将Qt5Xml.lib添加到链接器中,见下图(该界面是在项目中点击右键-&属性调出的)
加了Qt5Xml.lib之后,编译通过了。但是一运行,又报错!!而且这个错还是内部错!!看下图
这又是什么原因?起初以为是file.close()导致的,经过测试发现并不是。后来打开qt自带的example中有关QtXml的例子,找到相应的配置,发现引用的是Qt5Xmld.lib。于是将前面链接的Qt5Xml.lib改成Qt5Xmld.lib。再次编译运行,一切正常了。下面是运行的结果(成功生成simple.xml)。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
这个例子是在根据网上博客&Qt数据库(XML)&改写的一个操作XML的实现. 借鉴了很多里面的代码,大家可以结合上面的博客对照,相信你肯定会对XML的操作熟练起来. 我建立的是Qwidget项目,没有添加ui文件,输出内容都放在应用程序输出中(qDebug). XMLtest.pro文件代码: [cpp] view plaincopy #-
这个例子是在根据网上博客&Qt数据库(XML)&改写的一个操作XML的实现. 借鉴了很多里面的代码,大家可以结合上面的博客对照,相信你肯定会对XML的操作熟练起来. 我建立的是Qwidget项目,没有添加ui文件,输出内容都放在应用程序输出中(qDebug). XMLtest.pro文件代码: #------------------------- ...
Delphi操作XMl,只要使用 NativeXml.我是用的版本是4.02.NativeXML的使用方法比较简单,但是功能很强大. XE2的话,要在simdesign.inc后面加上: // Delphi XE2 / 16 {$ifdef VER230} {$define D7UP} {$define D10UP} {$define D15UP} {$en ...
1..NET对读写XML文件的支持(1)System.Xml命名空间
System.Xml命名空间为处理XML提供基于标准的支持,其中提供了许多管理XML文档和XML流方式的类,还提供了一些类(例如XmlDataDocument)则是提供了XML数据存储器和存储在DataSet中的关系数据之间的桥梁.
以下是System.Xml命名空间读写XML ...
650) this.width=650;& onclick='window.open(&/viewpic.php?refimg=& + this.src)' src=&/Images/OutliningIndicators/None ...
jdom操作xml文件(法老修正版)_jsp技巧 文章整理:西部数码--专业提供域名注册.虚拟主机服务
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! 这篇文章讲的不错~把JDOM的基本操作实例化了,不过由于当时的作者用的JDOM版本还比较陈旧,所以部分代码会编译出错!支持中文 ...
使用Attach更新(Update with Attach)说明:在对于在不同的DataContext之间,使用Attach方法来更新数据.例如在一个名为tempdb的NorthwindDataContext中,查询出Customer和Order,在另一个NorthwindDataContext中,Customer的地址更新为123 First Ave,Or ...
如何使用 TinyXML 在内存中操作 xml 格式的内容
例子 xml 内容: &?xml version=&1.0& encoding=&UTF-8& ?& &Config&
&Database ip=&192.168.1.33& port=&quot ...XML,全称为“可扩展标记语言”(extensible markuplanguage).是一种非常方便的数据交换与数据存储的工具。
我们在取得一个XML格式的文件后,需要作句法分析去提取发布方提供的信息。而Qt为XML提供了很好的支持,包括DOM方式的实现和SAX方式的实现。
二者主要区别是:
DocumentObject Model实现方式操作非常简单,但不适合处理过大文件;而实现方式是能处理很大的文件,但是需要开发者写一些复杂的代码。提供了对应于这两种用于读取、操作和编写的实现类,分别是QDomDocument类和QXmlStreamReader类,这里我们选QDomDocument类来处理XML文件。
首先是读取XML
主要操作包括:
&1).读取根节点:QDomElement
&root =doc.documentElement();
2).读取第一个子节点:QDomNode
&node = root.firstChild();
3).读取下一个子节点:node
= node.nextSibling();
4).匹配结点标记:node.toElement().tagName()
5).读取节点文本:no
=childNode.toText().data();
&&&&&QFilefile(fileName);
&&&&&if(!file.open(QFile::ReadOnly| QFile::Text)) {
&&&&&&&&&returnfalse;
&&&&&QStringerrorS
&&&&&interrorL
&&&&&interrorC
&&&&&QDomD
&&&&&if(!doc.setContent(&file,false, &errorStr,&errorLine,&errorColumn))
//setContent
是将指定的内容指定给QDomDocument
解析,第一参数可以是QByteArray或者是文件名等。
&&&&&&&&&returnfalse;
&&&&&file.close();
可以通过 doc.childNodes() 获得doc的所有的 子节点列表QDomNodeList。比如
QDomNodeList list=doc.childNodes();
for(inti=0;i&list.count();i++)
QDomNode &node=list.at(i);
// qDebug()&&”node nameis“&&node.nodeName();
// qDebug()&&”node typeis “&&node.nodeType();
通过上面的方法你就能知道每个节点的 名字和类型了,节点名字就是 标记 的名字。打印出来对照着
xml文件看就很容易明白了。QDomNode类是一个父类,QDomDocument是QDomNode的一个子类,鉴于大部分
QDomNode的类型都是QDomDocument.那么你可以使用toDocument()函数将QDomNode类型转换成QDomDocument.
QStringtext=node.toElement().text();
上面的语句可以将一个节点里的 文本 取出,也就是标记内的文本 部分。使用该函数获得的编码就已经是unicode格式了,不需要再做转换。
然后是写入XML
创建节点,将其写入文件,主要操作包括:
1).创建根节点:QDomElement
&root = doc.documentElement(&rootName &);
2).创建元素节点:QDomElement
&element=&doc.createElement_x_x_x(&nodeName&);
3).添加元素节点到根节点:root.
a(element);
4).创建文本节点:QDomText
&nodeText=doc.createTextNode(&text&);
5).添加文本节点到元素节点:element.
a(nodeText);
XML文件的内容:
&&&&QFile &file(fileName);
&&&&&if(!file.open(QFile::ReadOnly | QFile::Text))
&&&&&&&&&returnfalse;
&&&&&QString errorS
&&&&&interrorL
&&&&&interrorC
&&&&&QDomD
&&&&&if(!doc.setContent(&file,
false, &errorStr,&errorLine, &errorColumn))
&&&&&&&&&returnfalse;
&&&&&file.close();
&&&&&QDomElement root = doc.documentElement();
&&&&&if(root.tagName() !=
&&&&&&&&&returnfalse;
&&&&&QDomElement element =&&doc.createElement_x_x_x(&file&);
&&&&&QDomElement el_address = doc.createElement_x_x_x(&address&);
&&&&&QDomText text_address = doc.createTextNode(&text&);
&&&&&el_address.
(text_address);
&&&&&element.
(el_address);
&&&&&QDomElement el_path = doc.createElement_x_x_x_x(&path&);
&&&&&QDomText text_path = doc.createTextNode(&text&);
&&&&&el_path.
(text_path);
&&&&&element.
(el_path);
&&&&&root.
(element);
&&&&&QFile f(fileName);
&&&&&if(!f.open(QFile::WriteOnly| QFile::Text))
&&&&&&&&&returnfalse;
&&&&&QTextStream
&&&&&&out.setCodec(&UTF-8&);//中文编码
&&&doc.save(out,4,QDomNode::EncodingFromTextStream);
&&&&&doc.save(out, 3);
&&&&&f.close();
这里所有需要append的字节点只能由QDomDocument对象create,而不能直接new它,否则永远也看不到新添加的节点,另外,读取和写入的文件流必须创建两个,否则会将需要写入的文档继续在原来文档的后面,造成多个根节点。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61334次
排名:千里之外
原创:12篇
转载:67篇
(1)(2)(1)(3)(1)(1)(1)(2)(1)(1)(2)(3)(3)(1)(2)(2)(2)(3)(5)(2)(9)(1)(5)(14)(11)用Qt中的QDomDocument类处理XML文件
XML,全称为扩展标记语言(extensible markup language).是一种非常方便的数据交换工具。现在Blog的订阅系统输出格式就是满足XML规范的RSS格式,还有SVG矢量图形也使用了XML格式。
我们在取得一个XML格式的文件后,需要作句法分析去提取发布方提供的信息。而Qt为XML提供了很好的支持,包括DOM的实现和SAX的实现。
DOM 是Document Object Model的简称,其实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一 个标记。这种方式的优点是操作非常简单,缺点是需要将整个文件放入内存,不适合处理过大文件。这种方式在Qt中的实现类是QDomDocument,也是 本文将要讲解的。以Blog为代表的RSS文件都不会很大,适合用这种方式来处理。
SAX是Simple API for XML的简称,其实现方式是按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,调用开发者预先设计好的回调函数去处理。这种方式的缺点是需要开发 者写回调函数去处理不同标签,代码复杂一些,优点是能处理很大的XML文件。这种方式在Qt中的实现类叫QXmlStreamReader。
——————分割线以下,代码讲解———-
1)如果需要使用QDomDocument,那么请在你的项目.pro文件里加上一句”QT += xml”,不然无法编译通过。
QDomDQFile file(&rss.xml&);QString errorSint errorL int errorC//setContent是将指定的内容指定给QDomDocument解析,//第一参数可以是QByteArray或者是文件名等 if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol)){
//如果出错,则会进入这里。errorStr得到的是出错说明 //errorLine和errorCol则是出错的行和列}
如果上面的步骤没出错,那么恭喜你,你已经得到了一个完整的QDomDocument对象doc,你只要访问doc的子节点或子子节点就可以取得XML中所有标记上的内容了。
可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如
QDomNodeList list=doc.childNodes(); for(int i=0;i&list.count();i++){ QDomNode node=list.at(i);//好的风格当然是把定义写在外面:( //qDebug()&&&node name is &&&node.nodeName(); //qDebug()&&&node type is &&&.nodeType();}
通过上面的方法你就能知道每个节点的名字和类型了,节点名字就是标记的名字。打印出来 对照着xml文件看就很容易明白了。QDomNode类是一个父类,QDomDocument是QDomNode的一个子类,鉴于大部分QDomNode 的类型都是QDomDocument.那么你可以使用toDocument()函数将QDomNode类型转换成QDomDocument.
QString text=node.toElement().text();
上面的语句可以将一个节点里的文本取出,也就是标记内的文本部分。使用该函数获得的编码就已经是unicode格式了,不需要再做转换。
使用Qt中的QDomDocument读取XML文件
通过QDomDocument的方法可以容易解析一个XML文件,QDomDocument的每一个子对象和XML的每一个子节点对应,保留了相同的层次结构,能够做到随机访问XML中的节点。但它的缺点是需要将整个XML文件加载到内存中,不适合处理较大的文件。
今天要介绍的是QXmlStreamReader,就是按顺序读取XML的方式,每读取一个节点,应用就对当前节点做相应的处理(忽略或保存)。那么这种方式是SAX么?不是!
SAX 的处理方式虽然也是按节点顺序读取,但是对读取节点的处理方法不一样。SAX在碰到一个节点后,会去调用用户已经写好的回调函数,该回调函数是基类实现的 虚函数,不能改变它的名字,只能根据传入的参数实现不同处理,代码会比较复杂。但StreamReader的实现方式是由开发者通过readNext() 读入一个节点,然后判断节点内容,由开发者决定用什么函数去处理,对应不同节点层次实现不同函数,可维护性比较好。
具体流程是:
1. 创建一个QXmlStreamReader的类对象
2. 通过setDevice()设置好要处理的XML文件
3. 通过readNext()挨个读入节点,
4.a 通过isStartElement()和isEndElement()判断是节点的开始和结束
4.b 可以通过name()得到当前节点名字
4.c 可以通过readElementText()访问当前节点的内容
下面,来看看我处理rss2代码的例子,通过该类我读取了rss2里每个文件的标题。
因为需要实现自己的处理功能,我们用一个类RssRader继承自QXmlStreamReader
class RssReader : public QXmlStreamReader{…}
下面就可以使用该类了
reader.read(&file); //参数是QIODevice指针,file是QFile类型,
read是我在子类里实现的函数名,可以是其它名字,看看read()的实现
bool RssReader::read(QIODevice *device)
setDevice(device);//这是基类的函数,用于将XML传入解析器
while (!atEnd()) {
readNext(); //这个是关键函数,挨个读取节点
if (isStartElement()) {
if (name() == “rss”){
//我的实现,对rss作了处理,其它节点忽略
//read_rss()管理剩下的节点,碰到rss节点结束时返回
read_rss();
return !error();
//read_rss的实现,主要关心名为channel的节点,其他节点忽略
//XML的节点是对称的,有开始必有结束,判断的标志就是
//isStartElement()和isEndElement()
void RssReader::read_rss(){
qDebug()&&”read rss info”;
while (!atEnd()) {
readNext();
if (isStartElement()) {
if (name() == “channel”){
read_channel();
if (isEndElement()) {
if (name() == “rss”){
qDebug()&&”end read rss info”;
//读取节点内容的函数是readElementText(),由基类实现
void RssReader::read_item(){
while (!atEnd()) {
readNext();
if (isStartElement()) {
if (name() == “title”){
qDebug()&&”Title:”&&readElementText();
if (isEndElement()) {
if (name() == “item”){
/blog/?p=247
/blog/?p=358
在“QQ便签”项目组中我负责有关后台XML操作的实现部分,现在对在项目中用到的XML的相关操作进行简单的小结。
我 们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能 处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类 和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。
项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:
1. 创建节点,将其写入XML文件,主要操作包括:
1).创建根节点:QDomElement root = doc.documentElement(&rootName & );
2).创建元素节点:QDomElement element = doc.createElement(&nodeName&);
3).添加元素节点到根节点:root. appendChild(element);
4).创建元素文本:QDomText nodeText=doc.createTextNode(&text&);
5).添加元素文本到元素节点:element. appendChild(nodeText);
在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:
instruction = doc.createProcessingInstruction(&xml&,&version=\&1.0\& encoding=\&UTF-8\&&);
doc.appendChild(instruction);
QDomElement root = doc.createElement(&Notes&);
doc.appendChild(root);
QDomElement note = doc.createElement(&note&);
root.appendChild(note);
QDomElement no = doc.createElement(&no&);
note.appendChild(no);
QDomText no_text = doc.createTextNode(&001&);
则得到一个便签节点,将其保存到test.xml文件中,代码如下:
QFile file(&test.xml&);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
QTextStream out(&file);
out.setCodec(&UTF-8&);
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
则test.xml文件:
&?xml version=&1.0& encoding=&UTF-8&?&
&no&001&/no&
&name&(13:53:24)&/name&
&content&A meeting!&/content&
&font&Script MT Bold&/font&
&fontSize&16&/fontSize&
&color& #00ffff&/color&
&weight&0&/weight&
&fontItalic&true&/fontItalic&
&fontUnderline&true&/fontUnderline&
上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。
主要操作包括:
1).读取根节点:QDomElement root = doc.documentElement();
2).读取第一个子节点:QDomNode node = root.firstChild();
3).读取下一个子节点:node = node.nextSibling();
4).匹配结点标记:node.toElement().tagName() == &note&
5).读取节点文本:no = childNode.toText().data();
以下是项目中读取便签属性的函数实现代码:
void MainWindow::parseAttr(const QDomElement &element)
QString no,name,content,font,fontSize,
QDomNode node = element.firstChild();
while (!node.isNull()) {
if (node.toElement().tagName() == &note&) {//匹配note节点
parseAttr(node.toElement());
} else if (node.toElement().tagName() == &no&) {//匹配属性no
QDomNode childNode = node.firstChild();
if (childNode.nodeType() == QDomNode::TextNode) {
no = childNode.toText().data();
else if (node.toElement().tagName() == &name&) //匹配属性name
node = node.nextSibling();//读取兄弟节点
3. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。
以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相应的效率问题。
由 于本项目在启动时需要将所有便签加载到内存,因此选用DOM方式比较合适,但如果处理的XML文件很大,而且不需要全部读到内存时,可以用SAX实现方 式,它按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,可以调用开发者预先设计好的回调函数去处理,这样效率比DOM方式更高
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(1)(1)(4)(3)(1)(1)(3)(21)(8)(12)(26)(15)(1)(31)(36)(46)(69)(12)(37)(44)Qt之解析XML(QXmlStreamReader)
QXmlStreamReader 类提供了一个快速解析器,用于通过简单的流 API 读取格式良好的 XML。与之相对应的是 QXmlStreamWriter(写入 XML)。
相比较 Qt 自己的 SAX 解析器(见 QXmlSimpleReader),QXmlStreamReader 更快,更方便。某些情况下,在使用 DOM 树(见 QDomDocument)的应用程序中,它也可能是一个更快,更方便的替代方案。
QXmlStreamReader 可以从 QIODevice(见 setDevice())或原始 QByteArray(见 addData())中读取数据。
QXmlStreamReader 的基本概念是将 XML 文档呈现为标记流,类似于 SAX。
QXmlStreamReader 和 SAX 的主要不同点在于如何呈现 XML 标记。
使用 SAX,应用程序必须提供处理程序(回调函数),在解析器方便的情况下,从解析器中接收所谓的 XML 事件。 使用 QXmlStreamReader,应用程序代码本身驱动循环,并从 reader 中取出标记,一个接一个。通过调用 readNext() 完成,reader 从输入流中读取,直到完成下一个标记,此时返回 tokenType()。然后可以使用一组方便的函数 isStartElement() 和 text() 来检查标记,以获取已读取的信息。这种取出标记的方式最大优点是可以使用它构建递归下降解析器,也就是说,可以将 XML 解析代码轻松地分成不同的方法或类,这使得在解析 XML 时可以轻松跟踪应用程序自己的状态。
一个典型的 QXmlStreamReader 循环:
&作者&一去丶二三里
&主页&http://blog.csdn.net/liang
&个人说明&青春不老,奋斗不止!&C]]&&
解析源码如下:
QFile file(&Blogs.xml&);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
// 以只写模式打开文件
QXmlStreamReader reader(&file);
// 解析 XML,直到结束
while (!reader.atEnd()) {
// 读取下一个元素
QXmlStreamReader::TokenType nType = reader.readNext();
switch (nType) {
case QXmlStreamReader::StartDocument: {
// 开始文档
qDebug() && QString::fromLocal8Bit(&********** 开始文档(XML 声明) ********** &);
// XML 声明
QString strVersion = reader.documentVersion().toString();
QString strEncoding = reader.documentEncoding().toString();
bool bAlone = reader.isStandaloneDocument();
qDebug() && QString::fromLocal8Bit(&版本:%1
Standalone:%3&)
.arg(strVersion).arg(strEncoding).arg(bAlone) && &\r\n&;
case QXmlStreamReader::Comment: {
qDebug() && QString::fromLocal8Bit(&********** 注释 ********** &);
QString strComment = reader.text().toString();
qDebug() && strComment && &\r\n&;
case QXmlStreamReader::ProcessingInstruction: {
// 处理指令
qDebug() && QString::fromLocal8Bit(&********** 处理指令 ********** &);
QString strProcInstr = reader.processingInstructionData().toString();
qDebug() && strProcInstr && &\r\n&;
case QXmlStreamReader::DTD: {
qDebug() && QString::fromLocal8Bit(&********** DTD ********** &);
QString strDTD = reader.text().toString();
QXmlStreamNotationDeclarations notationDeclarations = reader.notationDeclarations();
// 符号声明
QXmlStreamEntityDeclarations entityDeclarations = reader.entityDeclarations();
// 实体声明
// DTD 声明
QString strDTDName = reader.dtdName().toString();
QString strDTDPublicId = reader.dtdPublicId().toString();
// DTD 公开标识符
QString strDTDSystemId = reader.dtdSystemId().toString();
// DTD 系统标识符
qDebug() && QString::fromLocal8Bit(&DTD : %1&).arg(strDTD);
qDebug() && QString::fromLocal8Bit(&DTD 名称 : %1&).arg(strDTDName);
qDebug() && QString::fromLocal8Bit(&DTD 公开标识符 : %1&).arg(strDTDPublicId);
qDebug() && QString::fromLocal8Bit(&DTD 系统标识符 : %1&).arg(strDTDSystemId);
qDebug() && &\r\n&;
case QXmlStreamReader::StartElement: {
// 开始元素
QString strElementName = reader.name().toString();
if (QString::compare(strElementName, &Blogs&) == 0) {
qDebug() && QString::fromLocal8Bit(&********** 开始元素 ********** &);
QXmlStreamAttributes attributes = reader.attributes();
if (attributes.hasAttribute(&Version&)) {
QString strVersion = attributes.value(&Version&).toString();
qDebug() && QString::fromLocal8Bit(&属性:Version(%1)&).arg(strVersion);
parseBlog(reader);
case QXmlStreamReader::EndDocument: {
// 结束文档
qDebug() && QString::fromLocal8Bit(&********** 结束文档 ********** &);
if (reader.hasError()) {
// 解析出错
qDebug() && QString::fromLocal8Bit(&错误信息:%1
字符位移:%4&).arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
file.close();
// 关闭文件
元素中的内容,进行单独解析:
void parseBlog(QXmlStreamReader &reader) {
while (!reader.atEnd()) {
reader.readNext();
if (reader.isStartElement()) {
// 开始元素
QString strElementName = reader.name().toString();
if (QString::compare(strElementName, &Blog&) == 0) {
qDebug() && QString::fromLocal8Bit(&********** 开始元素 ********** &);
} else if (QString::compare(strElementName, QStringLiteral(&作者&)) == 0) {
reader.readNext();
if (reader.isCharacters()) {
qDebug() && QStringLiteral(&作者:%1&).arg(reader.text().toString());
} else if (QString::compare(strElementName, QStringLiteral(&主页&)) == 0) {
qDebug() && QStringLiteral(&主页:%1&).arg(reader.readElementText());
} else if (QString::compare(strElementName, QStringLiteral(&个人说明&)) == 0) {
qDebug() && QStringLiteral(&个人说明:%1&).arg(reader.readElementText());
} else if (reader.isEntityReference()) {
// 实体引用
QString strName = reader.name().toString();
QString strText = reader.text().toString();
qDebug() && QString(&EntityReference : %1(%2)&).arg(strName).arg(strText);
} else if (reader.isCDATA()) {
QString strCDATA = reader.text().toString();
qDebug() && QString(&CDATA : %1&).arg(strCDATA);
reader.readNext();
if (reader.isCharacters()) {
QString strCharacters = reader.text().toString();
qDebug() && QString(&Characters : %1&).arg(strCharacters);
} else if (reader.isEndElement()) {
// 结束元素
QString strElementName = reader.name().toString();
if (QString::compare(strElementName, &Blogs&) == 0) {
qDebug() && QString::fromLocal8Bit(&********** 结束元素 ********** &);
// 跳出循环(解析 QXmlStreamReader::EndDocument)
} else if (QString::compare(strElementName, &Blog&) == 0) {
qDebug() && QString::fromLocal8Bit(&********** 结束元素 ********** &);
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 qt document 的文章

 

随机推荐