标签: qtxml

编辑QDomElement的值?

我需要编辑QDomElement的文本 - 例如

我有一个XML文件,其内容为 -

<root>    
    <firstchild>Edit text here</firstchild>
</root>
Run Code Online (Sandbox Code Playgroud)

如何编辑子元素的文本<firstchild>?

我在Qt 4.7中提供的QDomDocument类描述的QDomElement中没有看到任何函数

Edit1 - 我正在添加更多细节.

我需要读取,修改和保存xml文件.格式化文件如下 -

<root>    
    <firstchild>Edit text here</firstchild>
</root>
Run Code Online (Sandbox Code Playgroud)

元素的值需要编辑.我读取xml文件的代码是 -

QFile xmlFile(".\\iWantToEdit.xml");
xmlFile.open(QIODevice::ReadWrite);

QByteArray xmlData(xmlFile.readAll());

QDomDocument doc;
doc.setContent(xmlData);
Run Code Online (Sandbox Code Playgroud)

//读取必要的值

//回写修改后的值?

注意:我尝试将QDomElement强制转换为QDomNode并使用函数setNodeValue().但它不适用于QDomElement.

我们非常欢迎任何建议,代码示例,链接.

c++ qt qt4 qtxml

12
推荐指数
2
解决办法
2万
查看次数

将QDomElement转换为QString/Container类

假设我们有以下XML文档:

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>
Run Code Online (Sandbox Code Playgroud)

我想获得"子"节点的字符串表示并将它们附加到数组中(我不想丢失XML语法,所以.text()不是一个选项).例如,第一个孩子看起来像:

QString child = "<child name="first">12345</child>";
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来获取元素:

QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
    element = element.firstChildElement("children");
    if(element.isNull()) return;

    element = element.firstChildElement("child");
    while(element.isNull() == false)
    {
        doc = element.toDocument();
        if(doc.isNull() == false)
        {
            // save string into array
            array.append(doc.toString());
        }
        element = element.nextSiblingElement("child");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是doc.isNull总是返回false(看起来我无法将元素转换为文档).有什么方法可以执行此操作吗?

编辑:

我想补充说QString在这里不是强制性的.基本上任何可以在以后用于检索数据的类都可以(我将保存这些节点并使用它们稍后初始化其他对象).重要的是,即使原始文档被销毁,我也应该能够访问这些值.例如,可以将这些元素直接存储到某个数组(例如QList),以后可以用它来访问它们.

qt qtxml

9
推荐指数
1
解决办法
1万
查看次数

Qt C++ XML,验证DTD?

有没有办法使用Qt的XML处理来针对DTD验证XML文件?我试过谷歌搜索但似乎无法得到一个直接的答案.如果Qt不包含对验证XML文件的支持,那么自己实现验证的过程可能是什么?关于根据规范验证XML的任何好的参考?谢谢您的帮助!

c++ xml qt dtd qtxml

6
推荐指数
1
解决办法
2940
查看次数

如何使用Qt的QXmlQuery在本地文件上运行XPath查询?

我正试图从.kml文件中获取坐标,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
    <Document>
        <name>Name</name><Style id="roadStyle"><LineStyle><color>7fcf0064</color><width>6</width></LineStyle></Style><Snippet><![CDATA[<font size=+1><a href="http://example.com/">Printable view</a></font>]]></Snippet>
        <Placemark>
            <name>Example</name>
            <description><![CDATA[example]]></description><address>100 Example St</address><StyleMap><Pair><key>normal</key><Style><IconStyle><Icon><href>http://example.com</href></Icon><hotSpot x="0.000000" y="0.000000" xunits="fraction" yunits="fraction" /></IconStyle><ListStyle><ItemIcon><href>http://example.com</href></ItemIcon></ListStyle></Style></Pair><Pair><key>highlight</key><Style><IconStyle><scale>1.000000</scale><Icon><href>http://example.com</href></Icon><hotSpot x="0.000000" y="0.000000" xunits="fraction" yunits="fraction" /></IconStyle><ListStyle><ItemIcon><href>http://example.com</href></ItemIcon></ListStyle></Style></Pair></StyleMap><Point><coordinates>0.000000,0.000000,0</coordinates></Point><LookAt><longitude>0.000000</longitude><latitude>0.000000</latitude><range>100.000000</range><tilt>45.000000</tilt><heading>0.000000</heading></LookAt>
        </Placemark>
        <Placemark>
            <name>Route</name>
            <description><![CDATA[Example]]></description>
            <GeometryCollection>
                <LineString>
                    <coordinates>0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000 0.000000,0.000000,0.000000</coordinates>
                </LineString>
            </GeometryCollection>
            <styleUrl>#roadStyle</styleUrl>
        </Placemark>
    </Document>
</kml>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用QXmlQuery来检索带有类似于此的XPath字符串的坐标:

kml/Document/Placemark[last()]/GeometryCollection/LineString/coordinates
Run Code Online (Sandbox Code Playgroud)

我在这里测试过并确认它有效,到目前为止一直很好.但是我在Qt工作时遇到了一段可怕的时间.我已经尝试了很多东西,包括其他帖子中有关SO的建议,没有运气.以下是一些显示变化的示例:

void testQuery1(QString &filename) {
    QXmlQuery query;
    query.bindVariable("kmlFile", QVariant(filename));
    query.setQuery("declare default element namespace \"http://earth.google.com/kml/2.0\"; declare variable $kmlFile external; doc($kmlFile)//coordinates");

    QStringList results;
    query.evaluateTo(&results);

    qDebug() << results.size();
}

void testQuery2(QString …
Run Code Online (Sandbox Code Playgroud)

qt kml qtxml

6
推荐指数
1
解决办法
5200
查看次数

QDomDocument无法使用&lt;!doctype&gt;标记设置HTML文档的内容

当我使用QDomDocumentHTML内容时,如果<!doctype html>文档开头有,它将无法设置内容。但是为什么呢?例如,考虑以下代码片段:

 QDomDocument doc;
 QString content = "<!doctype html><html><body><a href='bar'>foo</a></body></html>";
 qDebug() << doc.setContent(content,false,0,0);
 QDomElement docElem = doc.documentElement();
 QDomNode a = docElem.firstChild();
 qDebug() << doc.childNodes().size() << docElem.childNodes().size();
Run Code Online (Sandbox Code Playgroud)

false该代码的输出仅是s 的列表!

doctype qt dom html-parsing qtxml

5
推荐指数
2
解决办法
2726
查看次数

Qt XML中属性的顺序不正确

我有以下代码:

element.clear();
element.setTagName("accountpoint");
element.setAttribute("code", QString(ID_CONST)+serial);
element.setAttribute("name", QString());
element.setAttribute("serial", serial);

QFile file(filename);
file.open(QIODevice::ReadWrite);
QTextStream stream(&file);
doc.save(stream, 4);
Run Code Online (Sandbox Code Playgroud)

我以为我会得到一个XML:

<accountpoint code="4871583314750580" name="" serial="14750580">
Run Code Online (Sandbox Code Playgroud)

但是我有:

<accountpoint serial="14750580" code="4871583314750580" name="">
Run Code Online (Sandbox Code Playgroud)

为什么?

PS是的,当然,在XML文档中它并不重要,但我想获得正确的属性顺序.

c++ xml qt qtxml

5
推荐指数
3
解决办法
2013
查看次数

如何在QtXml中调试QDomElement?

我有一个QDomElement,我想调试它,即在调试控制台中将其视为纯文本.为了使用qDebug()输出它,它需要采用QString格式,但是我没有看到QDomElement和QDomNode的任何转换方法.

任何的想法?谢谢!

c++ debugging qt qtxml

4
推荐指数
1
解决办法
2314
查看次数

QEventLoop:没有QApplication就无法使用

我正在尝试针对特定架构验证xml文件.
所以我将架构加载到QXmlSchema对象中.但我得到一些奇怪的错误.
我的代码看起来像:

int main() {

QUrl url("http://www.schema-example.org/myschema.xsd");

QXmlSchema schema;
if (schema.load(url) == true)
    qDebug() << "schema is valid";
else
    qDebug() << "schema is invalid";

return 1;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行上面的代码时,Qt错误地说:

QEventLoop:如果没有QApplication
QDBusConnection,则无法使用:在QCoreApplication之前创建的系统D_Bus连接.
申请可能行为不端.
QEventLoop:没有QApplication就无法使用

我的Qt Designer版本:qt4-designer 4:4.8.1-0ubuntu4.1
我的Qt Creator版本:qtcreator 2.4.1-0ubuntu2

有人可以帮我解决这个问题.
谢谢

qt qt4 qtxml

4
推荐指数
1
解决办法
2万
查看次数

C++/Qt QDomDocument:迭代所有 XML 标签

我的问题是,我有一个表示为的大型 XML 样式文件QDomDocument,我需要访问 XML 中多个位置上的某些标签

我的 XML 看起来像这样

<Mat1>
    <Name>Mat_1</Name>
    <Properties>
        <Size>10</Size>
        <SizeMod>G</SizeMod>
    </Properties>
</Mat1>
<Mat2>
    <Name>Mat_2</Name>
    <Properties>
        <Size>15</Size>
        <SizeMod>k</SizeMod>
    </Properties>
</Mat2>
Run Code Online (Sandbox Code Playgroud)

我需要访问所有出现的“SizeMod”和“Size”。问题是文件的布局将来可能会定期更改,我希望我的代码适用于文件的所有版本。

目前,我只是使用多个 for 循环遍历所有 childNode,直到达到所需的深度,然后使用 if 语句检查是否处于正确的节点。

但这似乎是一种糟糕的方法。

c++ xml qt qtxml

3
推荐指数
1
解决办法
5453
查看次数

QDomDocument 不会插入 QDomElement

我正在用 XML 做一些事情,现在我很困惑。这段代码完美运行:

    QDomElement new_item = doc.createElement(name);

    new_item.setAttribute("type", value.typeName());
    new_item.setAttribute("value", value.toString());

    doc.elementsByTagName(section).at(0).appendChild(new_item);
Run Code Online (Sandbox Code Playgroud)

但是如果我自己创建 QDomElement(不调用 createElement 方法),那么它不会被插入到文档中。像这样的东西不起作用:

    QDomElement new_item;

    new_item.setTagName(name);
    new_item.setAttribute("type", value.typeName());
    new_item.setAttribute("value", value.toString());

    doc.elementsByTagName(section).at(0).appendChild(new_item);
Run Code Online (Sandbox Code Playgroud)

谁能向我解释为什么我需要使用 createElement 方法?

谢谢 :)

c++ xml qt dom qtxml

2
推荐指数
1
解决办法
2889
查看次数

如何使用QDomDocument获取子节点的值?

收到这样的字符串:

<invoke name="CanClose" returntype="xml">
   <arguments>
       <string># 998.40</string>
       <number>49920</number>
   </arguments>
</invoke>
Run Code Online (Sandbox Code Playgroud)

我想用它QDomDocument来获取参数'子节点的索引值(我希望在示例中提取字符串"#998.40"和"49920").

这是我试过的:

QString argument(int index)
{
    QDomNode arg = xml->elementsByTagName("arguments").at(index);
    return arg.nodeValue();
}
Run Code Online (Sandbox Code Playgroud)

但即便arg是空洞的.我在这做错了什么?

提前致谢.

c++ xml qt dom qtxml

1
推荐指数
1
解决办法
1万
查看次数

在 QtXML (QDomElement) 中编写 XML 节点

我想写像这样的节点

<name>Peter</name> 
Run Code Online (Sandbox Code Playgroud)

(带有开始和结束标记)到 QDomDocument 中。

当我创建 QDomElements 并将它们作为子元素附加到父元素时:

QDomElement node = doc.createElement("node");
parent.appendChild(node);
Run Code Online (Sandbox Code Playgroud)

它们被添加为

<node/>
Run Code Online (Sandbox Code Playgroud)

到父元素。父级会自动获取开始和结束标记,因此文件将如下所示:

<parent>
    <node/>
</parent>
Run Code Online (Sandbox Code Playgroud)

但是我如何向我的节点添加一个值,使它看起来像我想要的(在开始和结束标记之间有值)。将一个新的 QDomElement 作为子节点添加到节点,它看起来就像 . 添加属性会显示为 ?

如果有人可以帮助我,那就太好了!谢谢!

c++ xml qt4 qtxml

1
推荐指数
1
解决办法
5904
查看次数

标签 统计

qtxml ×12

qt ×11

c++ ×8

xml ×6

dom ×3

qt4 ×3

debugging ×1

doctype ×1

dtd ×1

html-parsing ×1

kml ×1