Qt中修改XML文件中的节点值解决办法
Qt中修改XML文件中的节点值
不能修改XML文件的节点
xml文件:
<kdevelop>
<general>
<author>zeki</author>
<email>caizhiming@tom.com</email>
</general>
</kdevelop>
我写的源码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtXml>
#include <QDebug>
#include <QFile>
#include <QTextStream>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDomDocument dom;
QFile *file=new QFile("/home/qust/qt/XML/2.xml");
if(file->open(QIODevice::ReadOnly|QIODevice::WriteOnly))
{
dom.setContent(file);
}
QDomNodeList email=dom.documentElement().elementsByTagName("email");
qDebug()<<email.count();//打印 1
qDebug()<<email.item(0).toElement().text();//打印caizhiming@tom.com
QDomNode oldnode =email.item(0);
QDomText newnode=dom.createTextNode("99629968@qq.com");
email.at(0).replaceChild(newnode,oldnode);
QTextStream out(file);
dom.save(out,4);
file->close();
}
MainWindow::~MainWindow()
{
delete ui;
}
不能修改XML文件,运行后打开xml文件出现
XML解析错误:废弃 document 元素之后的内容
位置:file:///home/qust/qt/XML/2.xml
行:8,列:1:<?xml version='1.0'?>
^
该怎么修改xml 中节点的值呢??为什么不能使用setNodeValue()方法来修改接点的值???
大家帮帮忙,谢谢!!!
------解决方案--------------------
中间是TextNode。你修改它的值。
------解决方案--------------------
一般是操作节点的问题.
------解决方案--------------------
dom.setContent(file);
这一行就出错了吧,你的2.xml是不是有问题?
------解决方案--------------------
不能修改XML文件的节点
xml文件:
<kdevelop>
<general>
<author>zeki</author>
<email>caizhiming@tom.com</email>
</general>
</kdevelop>
我写的源码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtXml>
#include <QDebug>
#include <QFile>
#include <QTextStream>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDomDocument dom;
QFile *file=new QFile("/home/qust/qt/XML/2.xml");
if(file->open(QIODevice::ReadOnly|QIODevice::WriteOnly))
{
dom.setContent(file);
}
QDomNodeList email=dom.documentElement().elementsByTagName("email");
qDebug()<<email.count();//打印 1
qDebug()<<email.item(0).toElement().text();//打印caizhiming@tom.com
QDomNode oldnode =email.item(0);
QDomText newnode=dom.createTextNode("99629968@qq.com");
email.at(0).replaceChild(newnode,oldnode);
QTextStream out(file);
dom.save(out,4);
file->close();
}
MainWindow::~MainWindow()
{
delete ui;
}
不能修改XML文件,运行后打开xml文件出现
XML解析错误:废弃 document 元素之后的内容
位置:file:///home/qust/qt/XML/2.xml
行:8,列:1:<?xml version='1.0'?>
^
该怎么修改xml 中节点的值呢??为什么不能使用setNodeValue()方法来修改接点的值???
大家帮帮忙,谢谢!!!
------解决方案--------------------
中间是TextNode。你修改它的值。
------解决方案--------------------
一般是操作节点的问题.
------解决方案--------------------
dom.setContent(file);
这一行就出错了吧,你的2.xml是不是有问题?
------解决方案--------------------
- C/C++ code
#include <QtGui/QApplication> #include "mainwindow.h" #include <QDialog> #include <QFile> #include <QDebug> #include <QDomDocument> #include <QFile> QDomDocument m_doc; bool changeSave(); bool openXmlFile(QString FilePath); int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); changeSave(); return a.exec(); } bool openXmlFile(QString FilePath) { QFile file( FilePath ); if( !file.open( QFile::ReadOnly | QFile::Text ) ) { qDebug() << QObject::tr("error::ParserXML->OpenXmlFile->file.open->%s\n") << FilePath; return false; } if( !m_doc.setContent( &file ) ) { qDebug() << QObject::tr("error::ParserXML->OpenXmlFile->doc.setContent\n") << FilePath; file.close(); return false; } file.close(); return true; } bool changeSave() { if(!openXmlFile("I:/q.xml")) { return false; } //修改保存xml QDomElement root = m_doc.documentElement(); if(root.tagName()!= "kdevelop") return false; QDomNode n = root.firstChild(); while ( !n.isNull() ) { QDomElement e = n.toElement(); if( !e.isNull()) { if( e.nodeName() == "general" ) { QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表 for(int a=0; a<list.count(); a++) //遍历该列表 { QDomNode node = list.at(a); if(node.isElement()) { if( node.nodeName() == "author" ) { QDomNode oldnode = node.firstChild(); //标签之间的内容作为节点的子节点出现,得到原来的子节点 node.firstChild().setNodeValue("csdn"); //用提供的value值来设置子节点的内容 QDomNode newnode = node.firstChild(); //值修改过后 node.replaceChild(newnode,oldnode); //调用节点的replaceChild方法实现修改功能 } if( node.nodeName() == "email" ) { QDomNode oldnode = node.firstChild(); node.firstChild().setNodeValue("test@tom.com"); QDomNode newnode = node.firstChild(); node.replaceChild(newnode,oldnode); } } } } } n = n.nextSibling(); } QFile filexml("I:/q.xml"); if( !filexml.open( QFile::WriteOnly | QFile::Truncate) ){ qWarning("error::ParserXML->writeOperateXml->file.open\n"); return false; } QTextStream ts(&filexml); ts.reset(); ts.setCodec("utf-8"); m_doc.save(ts, 4, QDomNode::EncodingFromTextStream); filexml.close(); return true; }