1

我有几个具有以下样式的 xml 文档,但每个文档都包含不同的节点。

<Protocol version = "1.02">
    <property name = "Name">
         <QString>Example</QString>
    </property>
    <property name = "Description">
         <QString/>
    </property>
    <property name = "This goes deep">
         <class type = "Deeper">
             <property name = "Deep name">
                 <QString> data </QString>
             </property>

             // ...

         </class>
    </property>

我正在用 QDomElement/QDomNode 解析它。我需要从树中获取属性和节点值(正如我之前所说,未知,我们正在谈论数百个文件)。我得到值没有问题:

QString MMainForm::processXmlElement( const QDomElement& aElement ) const
{
    QString ret =""; 

    QDomNode node = aElement.firstChild();
    while ( !node.isNull() )
    {
        QDomElement e = node.toElement();
        if ( node.childNodes().size() > 0 )
        {
            ret += processXmlElement( e );
        }
        else
        {
            ret += node.nodeValue() + "\n";
        }
        node = node.nextSibling();
    }

    return ret;
}

但是获取属性(例如文本“Deep name”)真的让我很困惑。我知道 QDomElement 有一个 ::attributes() 函数,但生成的地图似乎总是只包含一个空字符串。以下代码显示了我一直在尝试提取属性的概念:

QString MMainForm::getAttributes( const QDomElement& aElement ) const
{
    QString ret = "";

    auto var = aElement.attributes();
    for ( int i=0; i < var.count(); ++i)
    {
        ret += var.item( i ).toText().data() + '\n';
    }

    return ret;
}

这在概念上是否正确?您将如何将所有属性提取到一个不错的列表/字符串中?

4

1 回答 1

1

由于您迭代了QDomNode相同类型 ( ) 的集合,因此您可以在每个项目上QDomAttr调用nodeName()和 方法:nodeValue()

auto var = aElement.attributes();
for ( int i=0; i < var.count(); ++i)
{
    ret += var.item(i).nodeName() + ": " + var.item(i).nodeValue() + '\n';
}

或者您可以将每个项目转换为 aQDomAttr并使用namevalue属性:

auto var = aElement.attributes();
for ( int i=0; i < var.count(); ++i)
{
    QDomAttr attribute = var.item(i).toAttr();
    ret += attribute.name() + ": " + attribute.value() + "\n";
}
于 2018-03-09T08:19:47.120 回答