我需要编辑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文件的代码是 -
Run Code Online (Sandbox Code Playgroud)QFile xmlFile(".\\iWantToEdit.xml"); xmlFile.open(QIODevice::ReadWrite); QByteArray xmlData(xmlFile.readAll()); QDomDocument doc; doc.setContent(xmlData);//读取必要的值
//回写修改后的值?
注意:我尝试将QDomElement强制转换为QDomNode并使用函数setNodeValue().但它不适用于QDomElement.
我们非常欢迎任何建议,代码示例,链接.
假设我们有以下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的XML处理来针对DTD验证XML文件?我试过谷歌搜索但似乎无法得到一个直接的答案.如果Qt不包含对验证XML文件的支持,那么自己实现验证的过程可能是什么?关于根据规范验证XML的任何好的参考?谢谢您的帮助!
我正试图从.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) 当我使用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 的列表!
我有以下代码:
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文档中它并不重要,但我想获得正确的属性顺序.
我有一个QDomElement,我想调试它,即在调试控制台中将其视为纯文本.为了使用qDebug()输出它,它需要采用QString格式,但是我没有看到QDomElement和QDomNode的任何转换方法.
任何的想法?谢谢!
我正在尝试针对特定架构验证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
有人可以帮我解决这个问题.
谢谢
我的问题是,我有一个表示为的大型 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 语句检查是否处于正确的节点。
但这似乎是一种糟糕的方法。
我正在用 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 方法?
谢谢 :)
收到这样的字符串:
<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是空洞的.我在这做错了什么?
提前致谢.
我想写像这样的节点
<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 作为子节点添加到节点,它看起来就像 . 添加属性会显示为 ?
如果有人可以帮助我,那就太好了!谢谢!