作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个具有以下样式的 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() 函数,但生成的 map 似乎总是只包含一个空字符串。下面的代码展示了我一直在尝试提取属性的概念:
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;
}
这在概念上是否正确?您将如何将所有属性提取到一个漂亮的列表/字符串中?
最佳答案
由于您遍历了相同类型 (QDomAttr
) 的 QDomNode
集合,您可以调用 nodeName()
和nodeValue()
每个项目的方法:
auto var = aElement.attributes();
for ( int i=0; i < var.count(); ++i)
{
ret += var.item(i).nodeName() + ": " + var.item(i).nodeValue() + '\n';
}
或者您可以将每个项目转换为 QDomAttr
并使用 name
和 value
属性:
auto var = aElement.attributes();
for ( int i=0; i < var.count(); ++i)
{
QDomAttr attribute = var.item(i).toAttr();
ret += attribute.name() + ": " + attribute.value() + "\n";
}
关于c++ - 如何在Qt中解析一个未知的xml并获取其中的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188597/
我是一名优秀的程序员,十分优秀!