Posts Tagged ‘XML’

使用第三方TinyXml类库解析XML文件

September 28th, 2013

使用tinyxml解析xml数据相比QDOM差不多是相同的,但是TinyXML更加通用。所以应用范围更广。下面来介绍这个类库。
» Read more: 使用第三方TinyXml类库解析XML文件

Qt学习之路——XML Editor

September 22nd, 2013

接着刚才的Write XML来写。。。。。
这个Editor有界面,我使用MVC的方式,插入数据都通过QStandardItem来插入,这个model都是tree view,通过QDomDocument里面的setContent()方法导入。然后就是通过firstChildElement来找到root节点,然后开始下面的工作。
XML数据与上一节内容相同,这里不再赘述。

XML读写流程 QDomElement -> QDomNodeList -> toElement ->…..

QDomElement xmlroot = document.firstChildElement();
QDomNodeList books = xmlroot.elementsByTagName("Book");
QDomElement book = books.at(i).toElement();
QDomNodeList chapters = book.elementsByTagName("Chapter");
QDomElement chapter = chapters.at(h).toElement();

其实感觉tree view model插入方式和QDomDocument方式很类似,都是要找到root节点,才能向后插入
model层级关系:root->bookitem->chapteritem

void Dialog::ReadFile()
{
    QStandardItem *root = new QStandardItem("Books");
    model->appendRow(root);

    QDomDocument document;
    QFile file(FileName);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        document.setContent(&file);
        file.close();
    }

    QDomElement xmlroot = document.firstChildElement();

    QDomNodeList books = xmlroot.elementsByTagName("Book");//通过root我找到child节点Book

    for(int i =0;i<books.count();i++)
    {
        QDomElement book = books.at(i).toElement();
        QStandardItem *bookitem = new QStandardItem(book.attribute("Name"));

        QDomNodeList chapters = book.elementsByTagName("Chapter");
        for(int h= 0;h<chapters.count();h++)
        {
            QDomElement chapter = chapters.at(h).toElement();
            QStandardItem *chapteritem = new QStandardItem(chapter.attribute("Name"));
            bookitem->appendRow(chapteritem);
        }
        root->appendRow(bookitem);

    }
}

void Dialog::WriteFIle()
//写的原理和读其实很类似,,他是从model中获取item而已,然后回复这个xml节点信息。
{

    QDomDocument document ;

    QDomElement xmlroot = document.createElement("Books");
    document.appendChild(xmlroot);

    QStandardItem *root = model->item(0,0);
    for(int i= 0;i < root->rowCount();i++)
    {
        QStandardItem *book = root->child(i,0);

        QDomElement xmlbook = document.createElement("Book");
        xmlroot.appendChild(xmlbook);

        xmlbook.setAttribute("Name",book->text());
        xmlbook.setAttribute("ID",i);


        for(int h =0 ;h< book->rowCount();h++)
        {
            QStandardItem *chapter = book->child(h,0);
            QDomElement xmlchapter = document.createElement("Chapter");
            xmlchapter.setAttribute("Name",chapter->text());
            xmlchapter.setAttribute("ID",h);
            xmlbook.appendChild(xmlchapter);
        }
    }

//    QFile file(FileName);
    QFile file("/home/lzz/test.xml");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << "Failed to write file";
    }
    QTextStream stream(&file);
    stream << document.toString();
    file.close();


    qDebug() << "Finished!!!";
}

2013-09-22 21:26:36的屏幕截图

Qt学习之路——Read XML with DOM

September 22nd, 2013

接着昨天的来讲写XML来讲,最大的问题就是要分清root与children节点。要知道你是在哪个节点操作的,是子节点还是父节点。
然后配合使用API来解析就可以了。我们要知道Tag就是<>中的属性。attribute就是属性值。 » Read more: Qt学习之路——Read XML with DOM

在Qt中编写XML文件

September 21st, 2013

对于XML文件,大家应该都会太陌生,只要定义好了XML的格式,我们就可以用来传送数据了。
XML本身没有什么表示,他不像HTML那样表现数据,每个Node也没有什么具体的含义,全部靠编程者自己定义。 » Read more: 在Qt中编写XML文件