Qt中DOM的读写

    对于一般的XML数据处理,Qt提供了QtXml模块。QXml模块提供了三种截然不同的应用程序编程接口用于读取XML文档:

       QXmlStreamReader 是一个用于读取格式良好的XML文档的快速解析器。

        DOM(文档对象模型)把XML文档转换为应用程序可以遍历的树形结构。

        SAX(XML简单应用程序编程接口)通过虚拟函数直接向应用程序报告“解析事件”。

    对于XML文件的写入,Qt也提供了三种可用的方法:

        使用QXmlStreamWriter。

在内存中以DOM树的结构表示数据,并要求这个数型结构将自己写到文件中。

        手动生成XML。

在这里我使用了DOM来对XML文件进行操作,代码如下:

生成的树形结构如下:

<?xml version ="1.0" encoding="UTF-8"?>
<ContactMan>
    <Info>
        <name>zhang san</name>
        <phone>110119120</phone>
    </Info>
</ContactMan>


bool RWXml::readFile(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        std::cerr << "Error: Cannot read file" <<std::endl;
        return false;
    }
    QString errorStr;
    int errorLine;
    int errorColumn;
    QDomDocument doc;

    if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorColumn))
    {
        std::cerr << "Error: Prase error at line " << std::endl;
        file.close();
        return false;
    }
    QDomElement root = doc.documentElement();
    QDomNode n = root.firstChild();
    while(!n.isNull())
    {
        QDomElement e= n.toElement();
        if(!e.isNull())
        {
            qDebug() << e.tagName() << ":" << e.text();
        }
        n = n.nextSibling();
    }

    file.close();;
    return true;
}
bool RWXml::writeFile(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QFile::Text | QFile::WriteOnly))
    {
        std::cerr << "Error: Cannot write file" << qPrintable(fileName) << std::endl;
         file.close();
         return false;
    }
    QDomDocument doc;
    QDomProcessingInstruction instruction;
    instruction = doc.createProcessingInstruction("xml" , "version =\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    QDomElement root = doc.createElement("ContactMan");
    doc.appendChild(root);

    QDomElement info_Node = doc.createElement("Info");
   /* QDomAttr nameAttr = doc.createAttribute("name");
    nameAttr.setValue("zhang san");
    QDomAttr phoneAttr = doc.createAttribute("phone");
    phoneAttr.setValue("110");
    info_Node.setAttributeNode(nameAttr);
    info_Node.setAttributeNode(phoneAttr);

    root.appendChild(info_Node);
    */
//********one

    QDomElement name_Node = doc.createElement("name");
    QDomElement phone_Node = doc.createElement("phone");

    QDomText text;
    text = doc.createTextNode("zhang san");
    name_Node.appendChild(text);
    text = doc.createTextNode("110119120");
    phone_Node.appendChild(text);

    info_Node.appendChild(name_Node);
    info_Node.appendChild(phone_Node);

    root.appendChild(info_Node);

    QTextStream out(&file);
    doc.save(out , 4);
    file.close();
    return true;
}

 

你可能感兴趣的:(Qt的XML,QT的数据库,QT的DOM,QT数据的读写)