从 QDomDocument 中提取属性值

Extracting attribute values from a QDomDocument

本文关键字:属性 提取 QDomDocument      更新时间:2023-10-16

我有一个xml块,我需要搜索它才能使用QDomDocument检索特定属性的值。不幸的是,目前该属性可以在名为"panel"的标签中,也可以位于名为"panel-config"的标签中。 为了进一步增加复杂性,"面板"通常是文档的根节点。无论如何,目前我的代码需要这样做:

QDomElement element = XML.documentElement();
if ((element.tagName() == "panel") && (element.hasAttribute(sFACETPANELID))) {
    panelId = element.attribute(sFACETPANELID);
}
else
{
    // Get all our panel nodes
    QDomNodeList nodes = element.elementsByTagName("panel");
    // Loop through our nodes and extract our paned id
    for (int i = 0; i < nodes.count(); ++i) {
        QDomElement panel = nodes.at(i).toElement();
        if (panel.hasAttribute(sFACETPANELID)) {
            panelId = panel.attribute(sFACETPANELID);
            break;
        }
    }   
}

其次是这个:

QDomNodeList nodes = element.elementsByTagName("panel_config");
for (int i = 0; i < nodes.count(); ++i) {
    QDomElement panel_config = nodes.at(i).toElement();
    if (panel_config.hasAttribute(sFACETCLUSTERID)) {
        clusterId = panel_config.attribute(sFACETCLUSTERID);
        break;
    }
}   

这太可怕了。理想情况下,我需要的是一种为与"panel"或"panel-config"(如果你愿意的话,elementByTagNames)匹配的任何标签检索nodeList()的方法,并在一个循环中遍历该列表。我也不想在尝试获取 elementsByTagName 之前检查顶级元素是否称为"面板"。如果可以在QT中完成,有什么建议吗?

编辑:删除了以前的代码

对于元素列表,请使用

//QDomDocument.elementsByTagName(...)
QDomNodeList panelList = XML.elementsByTagName("panel")
QDomNodeList panelCfgList = XML.elementsByTagName("panel-config")

它也将与根元素匹配。不幸的是,你不能直接在QDomNodeList中更改(或添加)节点,所以你必须制作包含两个列表的QList并循环访问它,或者像这样做循环

    for (int i = 0; i < panelList.count() || i < panelCfgList.count(); i++)
    {
        if (i < panelList.count())
        {
            QDomElement panel = panelList.at(i).toElement();
            if (panel.hasAttribute(sFACETPANELID))
            {
                panelId = panel.attribute(sFACETPANELID);
                break;
            }
        }
        if (i < panelCfgList.count())
        {
            QDomElement panelCfg = panelCfgList.at(i).toElement();
            if (panelCfg.hasAttribute(sFACETPANELID))
            {
                panelCfgId = panelCfg.attribute(sFACETPANELID);
                break;
            }
        }
    }