qt的xml读写和QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap讲解

在QT中除了使用QJsonDocument 、QJsonObject、QJsonArray、QJsonValue 来支持json文件的读写外,还可以通过QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap来支持xml的读写。

使用xml前需要在pro文件中加入QT += xml。
然后读xml文件时,通过QDomDocument关联QFile来读取xml文件1内容,如下:

  	QDomDocument doc;
    QFile file("test.xml");
    file.open(QIODevice::ReadOnly);
    doc.setContent(&file);

当QDomDocument关联Qfile成功后,就可以通过doc.toString()获取到xml的所有文本内容,同时通过QDomElement来获取到所有外部节点了,代码如下:

    QDomElement ele = doc.documentElement(); //通过遍历节点根据节点id找到需要操作的节点,修改其属性。
    QString svgXml = doc.toString();//将修改后的xml对象转为字符串

具体获取所有节点有两种方式:
方法1:通过ele.firstChild()拿到第一个节点,然后调用nextSibling拿到下一个节点。
方法2:通过ele.childNodes()直接拿到所有节点。
代码如下:

    QDomNode n = ele.firstChild();
    while ( !n.isNull() )
    {
    	 //...
          n = n.nextSibling();
    }
    for (int i = 0; i < ele.childNodes().size(); ++i)
    {
   		 //...
    }

拿到所有外部节点后,判断这个节点的类型,通过nodeType()获取节点类型,然后根据类型进行转换。
各类型如下:

enum NodeType {
ElementNode = 1,
AttributeNode = 2,
TextNode = 3,
CDATASectionNode = 4,
EntityReferenceNode = 5,
EntityNode = 6,
ProcessingInstructionNode = 7,
CommentNode = 8,
DocumentNode = 9,
DocumentTypeNode = 10,
DocumentFragmentNode = 11,
NotationNode = 12,
BaseNode = 21,// this is not in the standard
CharacterDataNode = 22 // this is not in the standard
};

转换方式如下;

QDomElement toElement() const;
QDomAttr toAttr() const;
QDomText toText() const;
QDomCDATASection toCDATASection() const;
QDomEntityReference toEntityReference() const;
QDomEntity toEntity() const;
QDomComment toComment() const;
QDomDocument toDocument() const;
QDomDocumentType toDocumentType() const;
QDomDocumentFragment toDocumentFragment() const;
QDomNotation toNotation() const;
QDomProcessingInstruction toProcessingInstruction() const;
QDomCharacterData toCharacterData() const;

根据类型转换后,可以通过nodeName()来获取节点名称,通过text()获取节点文本。通过attributes()获取节点中所有字段。
示例如下:

    for (int i = 0; i < ele.childNodes().size(); ++i)
    {
        //对根节点可以取得其对应的子节点
        QDomElement e = ele.childNodes().at(i).toElement();
        if( !e.isNull())
        {
            if(e.nodeName() == "title")
            {
                QDomElement echild = e.toElement();
                qDebug()<<"---title-----"<

这个示例中为什么我会转为QDomElement,因为我已经通过nodeType()知道它的类型了。
还有我为什么使用QDomNamedNodeMap map = echild.attributes()来获取字段,因为我已经通过echild.attributes().count()的大小知道它存在字段了。

你可能感兴趣的:(QT,qt,xml,c++)