Qt解析XML相关(QDom方式)

来源:互联网 发布:linux系统管理技术手册 编辑:程序博客网 时间:2024/06/07 15:44

一、根据QDomNode::TypeName名字找到第一个符合的node :

以下两个函数可以直接查询XML节点(QDomNode)是否存在名字tagName的子节点,不需要遍历子节点。firstChildElement  或者 namedItem.

    /* Shortcut to avoid dealing with QDomNodeList     * all the time. */    QDomNode namedItem(const QString& name) const;
QDomElement firstChildElement(const QString &tagName = QString()) const;

 与 firstChildElement 类似的(即可根据tagNeme查找子节点的函数)还有以下

    QDomElement firstChildElement(const QString &tagName = QString()) const;    QDomElement lastChildElement(const QString &tagName = QString()) const;    QDomElement previousSiblingElement(const QString &tagName = QString()) const;    QDomElement nextSiblingElement(const QString &taName = QString()) const;

上面这四个函数可以用来遍历子节点,与之类似的还有:firstChild(), nextSibling(), lastChild(), previousSibling(), parentNode(). 

for(QDomElement sElem = elem.firstChildElement(); !sElem.isNull(); sElem = sElem.nextSiblingElement())for(QDomElement sElem = elem.firstChildElement("要查找的tagName"); !sElem.isNull(); sElem = sElem.nextSiblingElement("要查找的tagName"))
他们的不同点是:firstChildElemment()查找的是必须有 nodeName有节点名字的节点,返回的是 element;函数中的参数就是nodename,可写可不写,有这个参数,就表明遍历的是 tagName 为某固定字符串的子节点

firstChild()查找所有子节点的第一个(不论有无nodeName),返回的是 node;

综上,在for 循环中遍历子节点,用firstChildElemment()、nestSiblingElemment()  和 firstChild()、nestSibling() 的遍历次数是不一样的,因为没有节点名的节点没有被firstChildElemment() 查找;

、根节点解析:

    QDomElement root = dom->documentElement();    QDomNodeList nodelist = root.childNodes();

三、解析节点中间<..> XXXXX </..>的文本 XXXXX

例如 <cor:Uri xsi:nil="false">mmarch://bin/DBE406EB-824C-48B9-AE93-9C3C7BECCB5A.bin</cor:Uri> ,使用

QString QDomElement::text() const;

四、保存element

解析XML文件的时候,常遇到的一个问题就是要修改element的值然后保存

QDomElement el = node_2.toElement();  //tag为key的节点QDomNode oldnode = el.firstChild();     //标签之间的内容作为节点的子节点出现,得到原来的子节点el.firstChild().setNodeValue(str);   //用提供的value值来设置子节点的内容QDomNode newnode = el.firstChild();     //值修改过后的子节点el.replaceChild(newnode,oldnode);       //调用节点的replaceChild方法实现修改功能

QDom 保存到文本流

xmldoc.save(out, 4, QDomNode::EncodingFromDocument);
原型:
void QDomNode::save(QTextStream &stream, int indent, EncodingPolicy encodingPolicy = QDomNode::EncodingFromDocument) const

五、遍历节点的属性

attribute() 函数,返回QDomNamedNodeMap 类型变量

        QDomNamedNodeMap attrs = custElem.attributes();        int size = attrs.size();        for(int i=0; i< size; ++i)        {            QDomNode node = attrs.item(i);            qDebug() << " node Name : Value :" << node.nodeName() << node.nodeValue();        }

六、 拷贝节点,避免引用

QDomNode cloneNode(bool deep = true) const;

七、 节点 <node/> 不为空 Null

bool QDomNode::isNull() const
节点 <node/> 调用 isNull,返回false;这个函数应该是判断有无此节点.

八、获取 XML 子节点:直系子节点 / 子孙~~节点

//QDomNode ::QDomNodeList childNodes() const;//Returns a list of all direct child nodes. 直接的子节点//QDomElement 和 QDocumentQDomNodeList elementsByTagName(const QString& tagname) const;//深层递归,获取所有子节点

0 0