【问题标题】:reading root element in xml not the child读取 xml 中的根元素而不是子元素
【发布时间】:2011-02-26 05:31:25
【问题描述】:

您好,我正在开发一个读取 XML 文件的应用程序。在这里,我试图读取“a”节点而不是节点“b”下的“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);
     }

【问题讨论】:

  • 首先我无法理解你的问题。接下来我看不到任何 XML。你能编辑一下你的问题吗??

标签: xml qt


【解决方案1】:

您可以使用 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 上测试了这段代码,如果你在这一行修复标签不匹配,它就可以工作:rrr

【讨论】:

    【解决方案2】:

    如果你的 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();
    

    可以使用。同样,您可以遍历直到您想要的&lt;name&gt;,并且可以使用它的值。 记住 childNodes() 将只返回直接孩子的列表。希望很清楚。它未经测试,但应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多