1

私はこのようなXML文書を持っています

<root>
 <stuff>
   <data foo="bar">
     <name>barf</name>
     <value>123</value>
   </data>
   <!-- ... --->
 </stuff>
</root>

そして、ツリーを再帰して、ツリーからすべての情報を取得したいと思います。

data bar
 name barf
 value 123

ただし、DomElement::text()は子のテキスト コンテンツ、つまりdata要素の「barf 123」も返します。

DOM を再帰するかなりコンパクトなコードをいくつか見つけました。

void MyClass::TraverseXmlNode(const QDomNode& node)
{
    QDomNode domNode = node.firstChild();
    QDomElement domElement;
    while(!(domNode.isNull())) 
    {
        if(domNode.isElement()) 
        {
            domElement = domNode.toElement();
            if(!(domElement.isNull()))
            {
                qDebug() << __FUNCTION__ << "" << domElement.tagName() << domElement.text();
            }
        }
        TraverseXmlNode(domNode);
        domNode = domNode.nextSibling();
    }
}
4

2 に答える 2

3

解決策は非常に簡単です: 要素のテキストを出力しないでください。代わりにテキスト ノードを探します。

void MyClass::TraverseXmlNode(const QDomNode& node)
{
  QDomNode domNode = node.firstChild();
  QDomElement domElement;
  QDomText domText;

  static int level = 0;

  level++;

  while(!(domNode.isNull())) 
  {
    if(domNode.isElement()) 
    {
      domElement = domNode.toElement();
      if(!(domElement.isNull()))
      {
        qDebug() << __FUNCTION__ << "isElement" << level << QString(level, ' ').toLocal8Bit().constData() << domElement.tagName().toLocal8Bit().constData();

        QDomNamedNodeMap nma = domElement.attributes();
        int l = nma.length();
        for(  int i=0; i < l; i++ )
        {
          QDomAttr tempa = nma.item(i).toAttr();
          qDebug() << __FUNCTION__ << "isElement"  << level << QString(level, ' ').toLocal8Bit().constData() << "attribute" << i << tempa.name().toLocal8Bit().constData() << tempa.value().toLocal8Bit().constData();
        }
      }
    }

    if(domNode.isText())
    {
      domText = domNode.toText();
      if(!domText.isNull())
      {
        qDebug() << __FUNCTION__ << "isText   " << level << QString(level, ' ').toLocal8Bit().constData() << domText.data().toLocal8Bit().constData();
      }
    }

    TraverseXmlNode(domNode);
    domNode = domNode.nextSibling();
  }

  level--;
}
于 2013-04-09T07:46:46.033 に答える