QtXml

Qt XML 读写

此文为阅读《《Qt4编程之XML》》笔记

读取XML
QXmlStreamReader 读取XML文档的快速解析器

QXmlStreamReader是Qt中读取XML文档最快且最简单的方式。
QXmlStreamReader根据记号工作,每次调用readNext()函数就会到下一个记号,用getter函数就可读取当前记号。

记号示例getter函数
startDocumentN/AisStandaloneDocument()
EndDocumentN/AisStandaloneDocument()
StartElement<item>name()
EndElement<\item>name()
CharactersAT&Ttext()
Invaild&error(),errorString()

例如:

<doc>
    <quote>hello world</quote>
</doc>

使用readNext得到的结果

startDocument
startElement (name() == “doc”)
startElement (name() == “quote”)
characters (text() == “hello world”)
endElement (name() == “quote”)
endElement (name() == “doc”)
endDocument

每次调用readNext(), 可以用isStartElement(), isCharacters()或直接用state()来测试当前记号的类型。

使用QXmlStreamReader可用以下方式

QXmlStreamReader xmlReader;
QFile file(fileName);
xmlReader.setDevice(&file);
...
xmlReader.readNext();
while (!xmlReader.atEnd())
{
  if (xmlReader.isStartElement())
  {
    if (xmlReader.name() == "doc")
    {
    }
    else
    {
      xmlReader.raiseError(tr("error"));
    }
  }
  else
  {
     xmlReader.readNext();
  }
}
DOM 文档对象模型
<doc>
    <quote>hello</quote>
    <tarns>world</tarns>
</doc>

利用DOM可以将上面xml文档建立模型如下
- Document
- Element (doc)
- Element (quote)
- text (“hello”)
- Element (tarns)
- text (“world”)

使用DOM可以通过以下方式

QFile file(fileName);
QDomDocument doc;
if (!doc.setContent(&file))
{
    qDebug() << "error";
    return;
}

QDomElement root = doc.documentElement();
if (root.tagName() == "doc")
{
  QDomNode child = root.firstChild();
  while (!child.isNull())
  {
    if (child.toElement().tagName() == "quote") 
    {
        if (child.toElement().text() == "hello")
        {}
    }
    else if (child.toElement().tagName() == "trans")
    {}
    child = child.nextSibling();
  }
}

QDomNode类可以存储任何类型的节点。如果想进一步处理一个节点,首先必须把它转换为正确的数据类型。

写入XML
QXmlStreamWriter

使用QXmlStreamWriter是目前最简单易行的方式,使用方式如下:

QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text))
{return;}

QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);

xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("doc");
xmlWriter.writeTextElement("quote", “hello");
xmlWriter.writeTextElement("trans", "world");
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();

如果项中有子项,就对每个子项调用writeIndexEntry().

DOM

尽管QXmlStreamWriter是写入xml最容易,最安全的方式,但如果已经在一个DOM树中有XML文档的时候,则需要在QDomDocument对象上调用save()函数并要求这个DOM树输出相关的XML即可。

const int Indent = 4;
QDomDocument doc;
...
QTextStream out(&file);
QDomNode xmlNode = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"ISO-8859-1\"");
doc.insertBefore(xmlNode, doc.firstChild());
doc.save(out, Indent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值