使用 Qt 搜索具有特殊父级的 XML 属性

Searching for XML attributes with special parent in with Qt

本文关键字:XML 属性 Qt 搜索 使用      更新时间:2023-10-16

如何管理我的XML读取器,搜索具有特殊父元素的属性?

例如,我的XML文件:

    <section name="aPoly">
        <attribute key="id" type="int">1</attribute>
        <attribute key="label" type="String">2</attribute>
        <section name="graphic">
            <attribute key="x" type="double">780.0</attribute>
            <attribute key="y" type="double">240.0</attribute>
            <attribute key="w" type="double">78.0</attribute>
            <attribute key="h" type="double">78.0</attribute>
        </section>
    </section>
    ...
    ...
    <section name="line">
        <attribute key="source" type="int">0</attribute>
        <attribute key="target" type="int">4</attribute>
        <section name="graphic">
            <attribute key="fill" type="String">#000000</attribute>
            <section name="poly">
                <section name="pt">
                    <attribute key="x" type="double">377.0</attribute>
                    <attribute key="y" type="double">240.0</attribute>
                </section>
                <section name="pt">
                    <attribute key="x" type="double">570.0</attribute>
                    <attribute key="y" type="double">240.0</attribute>
                </section>
                <section name="pt">
                    <attribute key="x" type="double">570.0</attribute>
                    <attribute key="y" type="double">330.0</attribute>
                </section>
            </section>
        </section>
    </section>

有多个属性具有key = "x" .我想将第 name="aPoly" 节的 x 值保存在一个数组中,将第 name="line" 节的 x 值保存到另一个数组中。

我正在搜索属性并将其保存到 QVector。(搜索所有 X 属性)。

  QDomElement root = document.documentElement();
  QDomNodeList key = root.elementsByTagName("attribute");
   for(int i = 0; i < key.count(); i++)
{
    QDomNode keynode = key.at(i);
    if(keynode.isElement())
    {
        QDomElement att = keynode.toElement();
        if (att.attribute("key") == "x"){
            xarray.push_back(att.text());
        }else if (att.attribute("key") =="y") {
            yarray.push_back(att.text());
        }...

我可以更改哪些内容来实现此目的?

编辑:

为什么他不填满我的阵列?它总是空的?我的错误在哪里?

 QXmlQuery query;
if (query.setFocus(&file))
{
    query.setQuery(QString("section/section/section[@name='aPoly']/section/attribute[@key='x']"));
    if (query.isValid())
    {
        QString result;
        query.evaluateTo(&result);
        QDomDocument dom;
        dom.setContent(QString("<Data>%1</Data>").arg(result));
        QDomNodeList children = dom.documentElement().childNodes();
        for (int i = 0; i < children.count(); i++)
        {
            QDomNode nod = children.at(i);
            if(nod.isElement())
            {
            QDomElement art = nod.toElement();
            Newarray.push_back(art.text());
            }
        }
    }
}
  qDebug() << "rnNewArray : " <<QList<QString>::fromVector(Newarray);
您可以使用

XQuery。类似于以下内容的 XPath 可用于您的目的,前提是section元素位于 sections 元素内,并且它是 xml 文档的根目录。

"sections/section[@name='aPoly']/attribute[@key='x']"

例如。

QXmlQuery query;
if (query.setFocus(yourXmlString)
{
    query.setQuery("sections/section[@name='aPoly']/attribute[@key='x']");
    if (query.isValid())
    {
        QString result;
        query.evaluateTo(&result);
        QDomDocument dom;
        dom.setContent(QString("<Data>%1</Data>").arg(result));
        QDomNodeList children = dom.documentElement().childNodes();
        for (int i = 0; i < children.count(); ++i) 
        {
            //children.at(i) is an attribute element which matches your criteria.
        }
    }
}