读取xml中的根元素而不是子元素

时间:2010-06-01 06:59:25

标签: xml qt

您好我正在处理一个读取XML文件的应用程序。在这里,我试图读取不在节点“b”下的“a”节点下的“name”节点。 当我尝试读取根“name”节点时,我得到了两个节点。  请帮我解决问题。 贝娄就是样本。

 <a>    
      <x>rrr</X>
      <b>
        <name> 123 </name>
      </b>
      <name> main </name>
      <c>yyyy</c>
    </a>





    QDomDocument mDocument;
     QDomElement  mDocumentElement;
     if (!mDocument.setContent(file.readAll())) 
     {          
         return ;      
     }      

     mDocumentElement = mDocument.documentElement();
     QDomNodeList list  = mDocumentElement.elementsByTagName("a").at(0).toElement().elementsByTagName("name");

     int count = list.count();
     for (int i = 0; i < count; i++)
     {
      QString str = list.at(i).nodeValue();
      QMessageBox::information(this, "text", str, QMessageBox::Yes, 0);
     }

2 个答案:

答案 0 :(得分:1)

如果您的XML遍历基于结构而不是基于内容类型,则可以按照此进行操作。

QDomDocument mDocument;
QDomElement  mDocumentElement;
if (!mDocument.setContent(file.readAll())) 
{          
    return ;      
}      

mDocumentElement = mDocument.documentElement();
QDomNodeList list = mDocumentElement.childNodes();
QDomElement firstChild = list.at(0).toElement(); // will return the first child
QDomElement secondChild = list.at(1).toElement(); // second child
   ......

获取标签之间的数据

QString childData = firstChild.text();

可以使用。同样,您可以遍历直到所需的<name>,并且可以使用其值。 请记住,childNodes()只返回直接子项列表。希望很清楚。它没有经过测试但应该有效。

答案 1 :(得分:0)

您可以使用QDomNode :: firstChild(QString tagName)和QDomNode :: nextSiblingElement(QString tagName)迭代“a”元素的直接子元素。代码如下:

QDomDocument mDocument;
if (!mDocument.setContent(file.readAll())) 
{          
    return ;      
}

QDomElement  mElement = mDocument.documentElement().firstChildElement("name");
while ( !mElement.isNull() )
{
    // do all you need to do with <name> element
    mElement = mElement.nextSiblingElement("name");
}

我已经在您的示例XML上测试了此代码,如果您要修复此行上的代码不匹配,它就会起作用:&lt; x&gt; rrr&lt; / X&gt;