QT中對XML的處理
QT自帶例子:
C:\Qt\Qt5.5.1\Examples\Qt-5.5\widgets\itemviews\simpledommodel\simpledommodel.pro
C:\Qt\Qt5.5.1\Examples\Qt-5.5\xml\dombookmarks\dombookmarks.pro
http://blog.sina.com.cn/s/blog_a6fb6cc90101eupl.html
如何使用QXmlStreamReader來解析格式良好的XML,Qt的文件中指出,它是一種更快、更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也較快,在某種情況下,比DOM(QDomDocument)更方便。
下面是對 QXmlStreamReader 讀取XML格式的原理探討圖,下面是對 以<和>為分界線對XML進行解析(除了剛開始的註釋外)
<?xml version="1.0" encoding="UTF-8"?>
<persons name="Qt">
<person id="1">
<name>wang</name>
<age>24</age>
<email>[email protected]</email>
<website>www.wang.com</website>
</person>
<person id="2">
<name>sugon</name>
<age>25</age>
<email> [email protected]</email>
<website>www.sugon.com</website>
</person>
</persons>
Starting E:\delcode\build-untitled-Desktop_Qt_5_5_1_MSVC2010_32bit-Debug\debug\untitled.exe... [wificommon]開始進入....readNext before: 1 0 readNext after: 1 38 "StartDocument" readNext before: 1 38 readNext after: 2 19 "StartElement" readNext before: 2 19 readNext after: 3 1 "Characters" readNext before: 3 1 readNext after: 3 15 "StartElement" readNext before: 3 15 readNext after: 4 1 "Characters" readNext before: 4 1 readNext after: 4 6 "StartElement" readNext before: 4 6 readNext after: 4 11 "Characters" readNext before: 4 11 readNext after: 4 17 "EndElement" readNext before: 4 17 readNext after: 5 1 "Characters" readNext before: 5 1 readNext after: 5 5 "StartElement" readNext before: 5 5 readNext after: 5 8 "Characters" readNext before: 5 8 readNext after: 5 13 "EndElement" readNext before: 5 13 readNext after: 6 1 "Characters" readNext before: 6 1 readNext after: 6 7 "StartElement" readNext before: 6 7 readNext after: 6 21 "Characters" readNext before: 6 21 readNext after: 6 28 "EndElement" readNext before: 6 28 readNext after: 7 1 "Characters" readNext before: 7 1 readNext after: 7 9 "StartElement" readNext before: 7 9 readNext after: 7 22 "Characters" readNext before: 7 22 readNext after: 7 31 "EndElement" readNext before: 7 31 readNext after: 8 1 "Characters" readNext before: 8 1 readNext after: 8 9 "EndElement" readNext before: 8 9 readNext after: 9 1 "Characters" readNext before: 9 1 readNext after: 9 15 "StartElement" readNext before: 9 15 readNext after: 10 1 "Characters" readNext before: 10 1 readNext after: 10 6 "StartElement" readNext before: 10 6 readNext after: 10 12 "Characters" readNext before: 10 12 readNext after: 10 18 "EndElement" readNext before: 10 18 readNext after: 11 1 "Characters" readNext before: 11 1 readNext after: 11 5 "StartElement" readNext before: 11 5 readNext after: 11 8 "Characters" readNext before: 11 8 readNext after: 11 13 "EndElement" readNext before: 11 13 readNext after: 12 1 "Characters" readNext before: 12 1 readNext after: 12 7 "StartElement" readNext before: 12 7 readNext after: 12 22 "Characters" readNext before: 12 22 readNext after: 12 29 "EndElement" readNext before: 12 29 readNext after: 13 1 "Characters" readNext before: 13 1 readNext after: 13 9 "StartElement" readNext before: 13 9 readNext after: 13 23 "Characters" readNext before: 13 23 readNext after: 13 32 "EndElement" readNext before: 13 32 readNext after: 14 1 "Characters" readNext before: 14 1 readNext after: 14 9 "EndElement" readNext before: 14 9 readNext after: 15 1 "Characters" readNext before: 15 1 readNext after: 15 10 "EndElement" readNext before: 15 10 readNext after: 16 0 "EndDocument"
程式碼如下:
void MainWindow::parseXML(QString file_name)
{
/*if(file_name.isEmpty())
return;
QFile *file = new QFile(file_name);
if(!file->open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::information(NULL, QString("title"), QString("open error!"));
return;
}
//QXmlStreamReader操作任何QIODevice.
QXmlStreamReader xml(file);
QList<QMap<QString,QString> > persons;
//解析XML,直到結束
while(!xml.atEnd() && !xml.hasError())
{
//讀取下一個element.
qDebug()<<"readNext before:"<<xml.lineNumber()<<xml.columnNumber();
QXmlStreamReader::TokenType token = xml.readNext();// <?xml version="1.0" encoding="UTF-8"?
qDebug()<<"readNext after:"<<xml.lineNumber()<<xml.columnNumber()<<xml.tokenString();
}
if(xml.hasError())
{
QMessageBox::information(NULL, QString("parseXML"), xml.errorString());
}
//從reader中刪除所有裝置、資料,並將其重置為初始狀態
xml.clear();
*/
#if 1
if(file_name.isEmpty())
return;
QFile *file = new QFile(file_name);
if(!file->open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::information(NULL, QString("title"), QString("open error!"));
return;
}
//QXmlStreamReader操作任何QIODevice.
QXmlStreamReader xml(file);
QList<QMap<QString,QString> > persons;
//解析XML,直到結束
while(!xml.atEnd() && !xml.hasError())
{
//讀取下一個element.
//qDebug()<<xml.lineNumber()<<xml.columnNumber()<<xml.characterOffset();
QXmlStreamReader::TokenType token = xml.readNext();// <?xml version="1.0" encoding="UTF-8"?
//qDebug()<<xml.lineNumber()<<xml.columnNumber()<<xml.characterOffset();
//如果獲取的僅為StartDocument,則進行下一個 //! QXmlStreamReader::StartDocument == <?xml version="1.0" encoding="UTF-8"?>
if(token == QXmlStreamReader::StartDocument)
{
//qDebug()<<"xml.documentVersion.toString()"<<xml.documentVersion().toString();
//qDebug()<<"xml.documentEncoding.toString()"<<xml.documentEncoding().toString();
continue;
}
//如果獲取了StartElement,則嘗試讀取
if(token == QXmlStreamReader::StartElement)
{
//如果為persons,直接進入下一個
if(xml.name() == "persons" && xml.attributes().hasAttribute("name") ==true)
{
qDebug()<<xml.attributes().value("name").toString();
continue;
}
//如果為person,則對其進行解析
if(xml.name() == "person")
{
persons.append(this->parsePerson(xml));
}
}
}
qDebug()<<"persons="<<persons;
if(xml.hasError())
{
QMessageBox::information(NULL, QString("parseXML"), xml.errorString());
}
//從reader中刪除所有裝置、資料,並將其重置為初始狀態
xml.clear();
#endif
}
QMap<QString,QString> MainWindow::parsePerson(QXmlStreamReader& xml)
{
QMap<QString,QString> person;
//檢查是否獲取person
//qDebug()<<"xml.name()="<<xml.name()<<xml.tokenType();
if(xml.tokenType() != QXmlStreamReader::StartElement &&
xml.name() == "person")
{
return person;
}
//獲取person屬性
QXmlStreamAttributes attributes = xml.attributes();
if(attributes.hasAttribute("id"))
{
person["id"] = attributes.value("id").toString();
}
//操作下一個
xml.readNext();
//qDebug()<<"readNext xml.name()="<<xml.name()<<xml.tokenType();
while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
xml.name() == "person"))
{
if(xml.tokenType() == QXmlStreamReader::StartElement)
{
if(xml.name() == "name")
{
this->addElementDataToMap(xml, person);
}
if(xml.name() == "age")
{
this->addElementDataToMap(xml, person);
}
if(xml.name() == "email")
{
this->addElementDataToMap(xml, person);
}
if(xml.name() == "website")
{
this->addElementDataToMap(xml, person);
}
}
xml.readNext();
}
QString id = person["id"];
QString name = person["name"];
QString age = person["age"];
QString email = person["email"];
QString website = person["website"];
return person;
}
void MainWindow::addElementDataToMap(QXmlStreamReader& xml,
QMap<QString, QString>& map) const
{
if(xml.tokenType() != QXmlStreamReader::StartElement)
{
return;
}
QString elementName = xml.name().toString();
xml.readNext();
if(xml.tokenType() != QXmlStreamReader::Characters)
{
return;
}
map.insert(elementName, xml.text().toString());
}
void MainWindow::on_tx_clicked()
{
//QFile file("C:\Users\Administrator\Desktop\image\\test.xml");
parseXML("C:\\Users\\Administrator\\Desktop\\image\\test.xml");
// file.open(QFile::ReadOnly | QFile::Text);
// xml.setDevice(&file);
// int icnt = 0;
}
void MainWindow::on_tx_clicked()
{
//QFile file("C:\Users\Administrator\Desktop\image\\test.xml");
//parseXML("C:\\Users\\Administrator\\Desktop\\image\\test.xml");
// file.open(QFile::ReadOnly | QFile::Text);
// xml.setDevice(&file);
// int icnt = 0;
QFile file("C:\\Users\\Administrator\\Desktop\\image\\test1.xml");
file.open(QFile::WriteOnly | QFile::Text);
writeFile(&file);
}
//! [1]
bool MainWindow::writeFile(QIODevice *device)
{
wxml.setAutoFormatting(true);
wxml.setDevice(device);
wxml.writeStartDocument();
wxml.writeDTD("<!DOCTYPE xbel>");//! xml 的解析方式為 xbel
wxml.writeStartElement("xx");
wxml.writeAttribute("folded", "yes" );
wxml.writeTextElement("title", "12345");
wxml.writeEmptyElement("hello");
wxml.writeEndElement();
wxml.writeEndDocument();
return true;
}
效果如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xbel>
<xx folded="yes">
<title>12345</title>
<hello/>
</xx>
寫也可以通過流的方式,更加簡單,如下所示:
class XmlStreamLint
{
public:
Q_DECLARE_TR_FUNCTIONS(XmlStreamLint)
};
int main(int argc, char *argv[])
{
enum ExitCode
{
Success,
ParseFailure,
ArgumentError,
WriteError,
FileFailure
};
QCoreApplication app(argc, argv);
QTextStream errorStream(stderr);
if (argc != 2)
{
errorStream << XmlStreamLint::tr(
"Usage: xmlstreamlint <path to XML file>\n");
return ArgumentError;
}
QString inputFilePath(QCoreApplication::arguments().at(1));
QFile inputFile(inputFilePath);
if (!QFile::exists(inputFilePath))
{
errorStream << XmlStreamLint::tr(
"File %1 does not exist.\n").arg(inputFilePath);
return FileFailure;
} else if (!inputFile.open(QIODevice::ReadOnly)) {
errorStream << XmlStreamLint::tr(
"Failed to open file %1.\n").arg(inputFilePath);
return FileFailure;
}
QFile outputFile("C:\\Users\\Administrator\\Desktop\\image\\test2.xml");
if (!outputFile.open( QIODevice::WriteOnly))
{
errorStream << XmlStreamLint::tr("Failed to open stdout.");
return WriteError;
}
// QFile outputFile;
// if (!outputFile.open(stdout, QIODevice::WriteOnly))
// {
// errorStream << XmlStreamLint::tr("Failed to open stdout.");
// return WriteError;
// }
//! [0]
QXmlStreamReader reader(&inputFile);
QXmlStreamWriter writer(&outputFile);
//! [0]
//! [1]
while (!reader.atEnd())
{
reader.readNext();
if (reader.error())
{
errorStream << XmlStreamLint::tr(
"Error: %1 in file %2 at line %3, column %4.\n").arg(
reader.errorString(), inputFilePath,
QString::number(reader.lineNumber()),
QString::number(reader.columnNumber()));
return ParseFailure;
//! [1]
//! [2]
} else
writer.writeCurrentToken(reader);
}
//! [2]
return Success;
}
readXmlFile(m_initFolderPath+"/"+m_xmlFileName);void MainWindow::readXmlFile(QString fileName)
{
QFile file(fileName);
if(!file.open(QFile::ReadOnly | QFile::Text))
{
qDebug()<<"open file"<<fileName<<"failed, error:"<<file.errorString();
return;
}
QDomDocument document;
QString strError;
int errLin = 0, errCol = 0;
if( !document.setContent(&file, false, &strError, &errLin, &errCol) )
{
qDebug()<<"parse file failed at line"<<errLin<<",column"<<errCol<<","<<strError;
return;
}
if( document.isNull() )
{
qDebug()<<"document is null !";
return;
}
QDomElement root = document.documentElement();
qDebug()<<root.tagName();
QDomElement catalogs = root.firstChildElement();
if( catalogs.isNull() )
{
return;
}
else
{
//qDebug()<<catalogs.tagName();
}
while(!catalogs.isNull())
{
foreachElement(catalogs);
catalogs = catalogs.nextSiblingElement();
}
file.close();
}
void MainWindow::foreachElement(QDomElement catalogs)
{
if(catalogs.tagName()=="")
return;
//qDebug()<<catalogs.tagName();
if(catalogs.hasAttributes())
{
QDomNamedNodeMap map = catalogs.attributes();
if(catalogs.tagName()==NodeSystemButton)
{
createSystemButton(map);
}
else if(catalogs.tagName()==NodeSAction)
{
createSAction(map);
}
else if(catalogs.tagName()==NodeRibbonPageSystemPopup)
{
createRibbonPageSystemPopup(map);
}
else if(catalogs.tagName()==NodeSRAction)
{
createSRAction(map);
}
else if(catalogs.tagName()==NodeRibbonQuickAccessBar)
{
createQuickAccessBar(map);
}
else if(catalogs.tagName()==NodeExitsAction)
{
bindingExitsAction(map);
}
else if(catalogs.tagName()==NodeQuickAction)
{
createQuickAction(map);
}
else if(catalogs.tagName()==NodeRibbonPage)
{
createRibbonPage(map);
}
else if(catalogs.tagName()==NodeRibbonGroup)
{
createRibbonGroup(map);
}
else if(catalogs.tagName()==NodeOptionButtonAction)
{
}
else if(catalogs.tagName()==NodeQMenu)
{
createPMenu(map);
}
else if(catalogs.tagName()==NodeQAction)
{
createPMQAction(map);
}
else if(catalogs.tagName()==NodePageQAction)
{
createPageQAction(map);
}
else if(catalogs.tagName()==NodeRibbonStatusBar)
{
createRibbonStatusBar();
}
else if(catalogs.tagName()==NodeStatusAction)
{
createStatusAction(map);
}
}
if(catalogs.hasChildNodes())
{
for(int i=0;i<catalogs.childNodes().length();++i)
{
foreachElement(catalogs.childNodes().at(i).toElement());
}
}
}
QString MainWindow::getNodeValue(QDomNamedNodeMap map, QString key)
{
QString tempValue=map.namedItem(key).nodeValue();
if(key=="Icon")
tempValue=m_initFolderPath+"/"+m_imageFolder+"/"+tempValue;
return tempValue;
}
<?xml version="1.0" encoding="gb2312"?>
<xxx>
<!--0不顯示此列 -->
<rrr>ttx1</rrr>
<tx test33="abc" test22="efg">1</tx>
</xxx>
QStringListMainWindow::SMSDXmlGet(QDomNodeList&value)
{
intcnt=value.count();
for(inti=0;i<cnt;i++)
{
QDomNodechildNode=value.at(i);
QDomNode::NodeTypettype=childNode.nodeType();
QStringnodeName=childNode.nodeName();
QStringnodeValue=childNode.nodeValue();
QDomElementelem=childNode.toElement();
//elem.text();
qDebug()<<"i==:"<<i<<"nodeName:"<<nodeName<<"nodeValue:"<<nodeValue<<"NodeType:"<<ttype<<"elem:"<<elem.text();
}
QStringListret;
returnret;
}
QStringList MainWindow::SMSDXmlGet(QDomNodeList &value)
{
int cnt = value.count();
for(int i=0;i<cnt;i++)
{
QDomNode childNode=value.at(i);
QDomNode::NodeType ttype = childNode.nodeType();
QString nodeName = childNode.nodeName();
QString nodeValue= childNode.nodeValue();
QDomNamedNodeMap attributeMap = childNode.attributes();
QDomNode attribute = attributeMap.item(0);
QString s1= attribute.nodeName();
QString s2= attribute.nodeValue();
int tt;
}
QStringList ret;
return ret;
}
void MainWindow::pushButton_4Slot()
{
int i=0;
QString filePath="mytest.xml";
QFile file(filePath);
if (file.open(QIODevice::ReadOnly))
{
QDomDocument document;
if (document.setContent(&file))
{
QDomNode &RootDomNode = document;
int RootDomNodeChildsCnt = RootDomNode.childNodes().count();
for(int i=1;i<RootDomNodeChildsCnt;i++)
{
QDomNode childNode = RootDomNode.childNodes().item(i);
QDomElement ele = RootDomNode.firstChildElement("ServiceManageShowDlgSet");
QDomNode ttx = RootDomNode.namedItem("serviceCNName") ;
QString sttx = ttx.nodeValue();
QDomNodeList childList = ele.childNodes();
int cnt=childList.count();
QStringList sRet= SMSDXmlGet(childList);
int tt=99;
// int childListCnt = childList.count();
// QString nodeName = childNode.nodeName();
// QString nodeValue= childNode.nodeValue();
// QDomNamedNodeMap attributeMap = childNode.attributes();
// QDomNode attribute = attributeMap.item(i);
// QString s1= attribute.nodeName();
// QString s2= attribute.nodeValue();
}
}
file.close();
}
}
建立XML:
int main( int argc, char **argv )
{
QApplication a( argc, argv );
QDomDocument doc("MyML");
QDomElement root = doc.createElement("MyML");
doc.appendChild(root);
QDomElement tag = doc.createElement("Greeting");
root.appendChild(tag);
QDomText t = doc.createTextNode("Hello World");
tag.appendChild(t);
QString xml = doc.toString();
//qDebug()<<"xml"<<xml;
QFile file("mydocument.xml"); //! 如果沒有此XML,會自動建立,如果有此XML,會覆蓋此XML
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
return 0;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
return 0;
}
相關推薦
QT中對XML的處理
QT自帶例子: C:\Qt\Qt5.5.1\Examples\Qt-5.5\widgets\itemviews\simpledommodel\simpledommodel.pro C:\Qt\Qt5.5.1\Examples\Qt-5.5\xml\dombookmarks\
Qt中的事件處理機制(event)
Qt事件也就是Qt程式中出現的一系列“事情”,包括對使用者操作做出反應時發出的滑鼠或鍵盤事件等;以及系統內部自動發出的定時器事件等。總之,出現了這些事件後就需要對這些事件進行處理,處理的方法便是“事件處理機制”。 圖1 Qt事件產生 以
Hive 中對 json 處理
應用場景:使用Hive對日誌資訊進行查詢分解,log裡面記錄的是json形式的資料: {"logid":"5d40e1af-19f7-4aad-af8f-c7247e322e5c","souc":"4","devi":"OPPO R7sm","sys":"22,5.1.1","dname":"D
java中對xml的讀取和寫入
java對xml操作需匯入dom4j的jar包(如下): (解析)讀取xml: package com.rj.bd.xml.jx; import java.io.File; import java.util.List; import org.dom4j.Attri
C#中對 XML節點進行新增,刪除,查詢和刪除操作
從網上整理所得 XMLDocument來操作XML比較簡單,雖然有時效率不是很高。程式碼如下 已知有一個XML檔案(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <books
as3中對xml的建立,增加,刪除,修改,檢索
//建立xml物件的兩種方式 var shuju:String="<a><b>你好</b><c>中國</c></a>"; //var xml:XML=new XML(shuju); var xml:XM
QT中讀取XML檔案三種方式 的例項
第一部分:QXmlStreamReader XML(eXtensible Markup Language)是一種通用的文字格式,被廣泛運用於資料交換和資料儲存(雖然近年來 JSON 盛行,大有取代 XML 的趨勢,但是對於一些已有系統和架構,比如 WebService,由於歷史原因,仍舊會繼
Spring專案中對XML檔案熱載入程式碼實現
前言: 平時我們進行Spring專案開發的時候,經常需要因為XML的改變而重啟伺服器,假如專案較大的時候,重啟將會非常耗時。最近編寫的webschool框架需要用到較多的XML檔案進行配置,在這裡參考公司程式碼,實現了對XML檔案的熱載入。 效果 每
Qt中富文字處理相關類
1、QAbstractTextDocumentLayout:抽象基類,用於實現QTextDocuments的自定義佈局。Qt提供的標準佈局可以處理簡單的字處理,包括內聯影象、列表和表。有些應用程式,例如文書處理程式或DTP應用程式可能需要比Qt佈局引擎提供的功能更多的特性,在這種情況下,您可以子類化
Groovy中對xml的操作補充
Android中Gradle編譯器使用的是Groovy語言,Groovy為我們提供了一系列的工具類用於處理xml檔案。 在此,補充一些文件中遺漏的點: 1.一些Groovy中的xml工具類找不到 可以嘗試 import groovy.xml.*類似於Namespace、Q
Qt中對圖片中的顏色進行修改
由Qimage的colorTable方法獲得圖片中全部的顏色,然後找到你要更換的顏色,把顏色的編號交給setColor方法就可以了,具體請看qt的文件。 QImage image(":/image//
qt中關於xml的讀取、寫入、修改等操作
通過專案的開發,我發現xml的讀寫主要是分為以下幾種型別: 一種型別是: <?xml version="1.0" encoding="UTF-8"?> <POIS> <POI LightMode="head_ligh
Java中對xml檔案的四種解析方式
books.xml <?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="1"> <name>冰與火之歌</name>
在 Perl 中利用 DOM 和 XPath 對 XML 進行有效處理
“文件物件模型(DOM)”是一個與平臺和語言無關的介面,它用於動態訪問和更新 XML 文件的內容、結構和樣式。DOM 定義了一組表示文件的標準介面、一個用於組合這些物件的標準模型和一組用於訪問和操縱它們的標準方法。DOM 是一個“W3C 建議”,這使它成為大家公認的 Web 標準。可以用包括 Perl、
python中對文件的處理
and 刪除 eva 改密 名稱 賬號 字典 oat 行為 1.當文件中存放的用戶名的密碼,是以字符串的形式存儲時,怎麽進行讀取和操作 eg:MLing,123456 niuniu,234567 luoluo,345678 方法一:將字符串轉為字典 1)字典查找的效
javascript中的循環引用對象處理
block pan script 需要 恢復 clas 對象處理 ren nbsp 先說明一下什麽是循環引用對象: var a={"name":"zzz"}; var b={"name":"vvv"}; a.child=b; b.parent=a; 這裏的a和b
Mapper.xml中對象的關聯
-1 語句 屬性 mage 額外 man 才會 img pan 對象的關聯,特別是manytoone的關聯,有兩種方式:發送一條額外sql去查詢和內聯的方式 發送一條額外sql:當我在使用到這個關聯對象的時候,我發送一條額外的sql去把這個關聯的對象查詢出來,然後設置到對象
將xml處理為json對象數組
lac XML match return function str == new for function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeigh
WinForm中DataGridView對XML文件的讀取
return nap 3.3 一個 owin 方法 tchar 微軟 單個 XML文件是一種常用的文件格式,例如WinForm裏面的app.config以及Web程序中的web.config文件,還有許多重要的場所都有它的身影。Xml是Internet環境中跨平臺的,依賴
應用服務器中對JDK的epoll空轉bug的處理
原因 use content jet 行修改 部分 重要 jdk5 調用 原文鏈接:應用服務器中對JDK的epoll空轉bug的處理 前面講到了epoll的一些機制,與select和poll等傳統古老的IO多路復用機制的一些區別,這些區別實質可以總結為一句話, 就是epol