使用QDomElement浏览XML标记

时间:2014-08-27 07:29:34

标签: c++ xml qt

我必须使用以下格式解析xml文件:

<FirstTag>
    <SecondTag>
        <Attribute value="hello"/> 
    </SecondTag>
</FirstTag>

现在这就是我所拥有的:

QDomNode n = domElem.firstChild();
while(!n.isNull()){
  QDomElement e = n.toElement();
  if(!e.isNull()){
    if(e.tagName() == "FirstTag"){
      //secondtag???
    }
  }
n = n.nextSibling();
}

现在我的实际问题: 我想从SecondTag访问一个属性,如何访问它,因为它是FirstTag中的一个子标签,我无法在当前循环中访问它。

3 个答案:

答案 0 :(得分:0)

不要这样做。首先使用documentElement()然后(在返回的对象上)使用elementsByTagName()搜索嵌套元素。

答案 1 :(得分:0)

看起来您已经错过了QDomNode有子节点和函数childNodes()来获取节点的子节点。

因此,如果QDomNode n指向第一个元素,而不是只查找第一个Child,则获取每个元素的子节点,检查正确的节点名称,然后检查每个子节点的子节点。要获取属性,您可以执行以下操作: -

QString attribValue;
QDomNodeList children = n.childNodes();

QDomNode childNode = children.firstChild();
while(!childNode.isNull())
{
    if(childNode.nodeName() == "Attribute")
    {    // there may be multiple attributes
         QDomNamedNodeMap attributeMap = node.attributes();

         // Let's assume there is only one attribute this time
         QDomAttr item = attributeMap.item(0).toAttr();
         if(item.name() == "value")
         {
            attribValue = item.value(); // which is the string "hello"
         } 
    }       
}

这可以通过递归函数为每个节点及其子节点完成。

答案 2 :(得分:0)

这是非常简单的XML文档,所以试试这个。此代码可以随意使用

QDomDocument doc("mydocument");
QFile f("G:/x.txt");
if (!f.open(QIODevice::ReadOnly))
    qDebug()  <<"fail";
if (!doc.setContent(&f)) {
    f.close();
    qDebug() <<"fail";
}
f.close();

QDomElement domElem = doc.documentElement();//FistTag here
QDomNode n = domElem.firstChild();//seconTag here
  QDomElement e = n.toElement();
  if(!e.isNull()){
      n = n.firstChild();//now it is attribute tag

      e = n.toElement();
        qDebug() << e.attribute("value") <<"inside" << e.tagName();
  }

输出:"hello" inside "Attribute"