DOM是一种解析由万维网协会(W3C)所开发的XML文档的标准应用程序编程接口。Qt提供一套用于读取、操作和编写XML文档的非验证型二级DOM实现。
DOM把XML文件表示成内存中的一棵树。我们可以按需要遍历这个DOM树,也可以修改这个树并把它作为XML文件保存到磁盘中。
让我们考虑如下这个XML文档:
<doc>
<quote>Scio me nihil scire</quote>
<translation>I know that I know nothing></translation>
</doc>
它对于如下所示的DOM树:
Document
Element(doc)
Element(quote)
Text(“Scio me nihil scire”)
Element(translation)
Text(“I know that I know nothing”)
这个DOM树包含不同类型的节点。例如,Element节点对应打开标签以及与它匹配的关闭标签。在这两个标签之间的内容则作为这个Element节点的子节点出现。 (注意蓝色字体)
上面的介绍主要是用来说明dom树的结构情况,下面则进入正题看如何通过qt来达到修改xml文件的目的。本文中主要说明如何修改xml属性值以及节点值,
修改属性值的代码如下:
bool QXmlEdit ::SetAValue (const QString &key , const QVariant &value )
{
try
{
QString tag ;
QString attName ;
QStringList sl =key .split ("/" );
tag = sl .at (0);
attName = sl .at (1);
QDomElement docElem = doc .documentElement ();
QDomNodeList nodeList = docElem .elementsByTagName (tag );
if (nodeList .count () >0 )
{
QDomElement el = nodeList .at (0).toElement ();
el .setAttribute (attName ,value .toString ()); //设置属性值QFile file (fileName );
if (!file .open (QIODevice ::WriteOnly | QIODevice ::Text ))
{
return false ;
}
QTextStream out (&file );
doc .save (out ,4);
}
return true ;
}
catch (...)
{
return false ;
}
}修改节点值的代码如下:
bool QXmlEdit ::SetTValue (const QString &key , const QVariant &value )
{
try
{
QDomElement docElem = doc .documentElement ();
QDomNodeList nodeList = docElem .elementsByTagName (key );
if (nodeList .count () >0 )
{
QDomElement el = nodeList .at (0).toElement (); //tag为key的节点
QDomNode oldnode = el .firstChild (); //标签之间的内容作为节点的子节点出现,得到原来的子节点
el .firstChild ().setNodeValue (value .toString ()); //用提供的value值来设置子节点的内容QDomNode newnode = el .firstChild (); //值修改过后的子节点el .replaceChild (newnode ,oldnode ); //调用节点的replaceChild方法实现修改功能
QFile file (fileName );
if (!file .open (QIODevice ::WriteOnly | QIODevice ::Text ))
{
return false ;
}
QTextStream out (&file );
doc .save (out ,4);
}
return true ;
}
catch (...)
{
return false ;
}
}
至此我们就实现了修改xml属性及text的功能。
看完了,访问下我做的网站作为支持吧 www.xiabanl.com 下班族论坛