QtXml:QDomDocument、QDomNode

QDomDocument

一、描述

QDomDocument 类表示整个 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的主要访问。

由于元素、文本节点、注释、处理指令等不能存在于文档的上下文之外,因此文档类还包含创建这些对象所需的工厂函数。创建的节点对象有一个 ownerDocument() 函数,该函数将它们与创建它们的上下文中的文档相关联。

解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问这些对象树。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除。

元素、文本节点等的创建是使用此类中提供的各种工厂函数完成的。使用 QDom 类的默认构造函数只会导致无法操作或插入文档的空对象。

注意:如果 XML 文档很大,DOM 树最终可能会消耗大量内存。对于此类文档,QXmlStreamReader 类可能是更好的解决方案。

QDom 类通常如下使用:

QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file))
{
file.close();
return;
}
file.close();

QDomElement docElem = doc.documentElement();

QDomNode n = docElem.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement();
if(!e.isNull())
{
cout << qPrintable(e.tagName()) << '\n';
}
n = n.nextSibling();
}

QDomElement elem = doc.createElement("img");
elem.setAttribute("src", "myimage.png");
docElem.appendChild(elem);

要使用 DOM 创建文档,请使用如下代码:

QDomDocument doc("mydocument");
QDomElement root = doc.createElement("MyML");
doc.appendChild(root);

QDomElement tag = doc.createElement("Greeting");
root.appendChild(tag);

QDomText t = doc.createTextNode("Hello World");
tag.appendChild(t);

// QString xml = doc.toString();
QFile file("demo.xml");
file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();

 

二、成员函数

1、QDomDocument(const QDomDocument&x)

拷贝构造。副本的数据是共享的(浅拷贝),修改文档的一个节点另一个文档也会改变。

2、QDomDocument(const QDomDocumentType & doctype)

根据类型创建文档。

3、QDomDocument(const QString &name)

创建文档并将文档类型的名称设置为 name。

4、QDomDocument & operator=(const QDomDocument &x)

赋值操作。浅拷贝。

5、QDomAttr createAttribute(const QString &name)

创建名为 name 的新属性,该属性可以使用 QDomElement::setAttributeNode()插入到元素中。

如果name不是有效的XML名称,则此函数的行为由QDomImplementation::InvalidDataPolicy 控制。

QDomDocument doc;
QFile file("demo.xml");
if (!file.open(QIODevice::ReadOnly))
return 0;
if (!doc.setContent(&file))
{
file.close();
return 0;
}
file.close();

QDomElement docElem = doc.documentElement();
QDomAttr node = doc.createAttribute("test");
node.setValue("666");
docElem.setAttributeNode(node);

file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();

 

6、QDomAttr createAttributeNS(const QString &nsURI, const QString &qName)

创建具有命名空间支持的新属性,该属性可以插入到元素中。 属性的名称是 qName,命名空间 URI 是 nsURI。

如果name不是有效的XML名称,则此函数的行为由QDomImplementation::InvalidDataPolicy 控制。

QDomDocument doc;
QFile file("demo.xml");
if (!file.open(QIODevice::ReadOnly))
return 0;
if (!doc.setContent(&file))
{
file.close();
return 0;
}
file.close();

QDomElement docElem = doc.documentElement();
auto nsattr = doc.createAttributeNS("url1", "p:at");//命名空间url1
docElem.setAttributeNodeNS(nsattr);

file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();

auto nsattr = doc.createAttributeNS("url1", "p:at");//命名空间url1
nsattr.setValue("111");
docElem.setAttributeNodeNS(nsattr);

 

 

 

参考:

XML 命名空间

避免混合使用NS和非NS版本的DOM API

7、QDomCDATASection createCDATASection(const QString &value)

创建一个新的 CDATA 部分。

如果 value 包含不能存储在 CDATA 部分中的字符,则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

QDomCDATASection node = doc.createCDATASection(QObject::tr("This is a comment"));
docElem.insertBefore(node,docElem.firstChild());

 

8、QDomComment createComment(const QString &value)

创建注释。

如果 value 包含不能存储在 XML 注释中的字符,则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

QDomElement docElem = doc.documentElement();
QDomComment node = doc.createComment(QObject::tr("This is a comment"));
docElem.insertBefore(node,docElem.firstChild());

 

9、QDomDocumentFragment createDocumentFragment()

创建一个新的文档片段,可用于保存文档的一部分。

QDomElement docElem = doc.documentElement();
QDomComment node = doc.createComment(QObject::tr("This is a comment"));
docElem.insertBefore(node,docElem.firstChild());

QDomDocumentFragment fragNode = doc.createDocumentFragment();
fragNode.appendChild(doc.createComment(QObject::tr("This is a Fragment comment")));
docElem.insertBefore(fragNode,docElem.firstChild());

10、QDomElement createElement(const QString &tagName)

创建一个名为 tagName 的新元素,它可以插入到 DOM 树中。

如果 tagName 不是有效的 XML 名称,则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

QDomElement docElem = doc.documentElement();
QDomElement node = doc.createElement("elementNode");
docElem.appendChild(node);

 

11、QDomElement createElementNS(const QString &nsURI, const QString &qName)

创建一个具有命名空间支持的新元素,可以插入到 DOM 树中。 元素的名称是 qName,命名空间 URI 是 nsURI。

如果 qName 为空字符串,则无论是否设置了无效数据策略,都返回空元素。

QDomElement docElem = doc.documentElement();
QDomElement ElementNSNode = doc.createElementNS("url1", "p:at");
ElementNSNode.setTagName("xxx");
ElementNSNode.setAttributeNS("url1", "p:at","666");
docElem.appendChild(ElementNSNode);

 

12、QDomEntityReference createEntityReference(const QString &name)

创建一个名为 name 的新实体引用,可以插入到文档中。

如果 name 不是有效的 XML 名称,则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

QDomElement docElem = doc.documentElement();
QDomEntityReference node = doc.createEntityReference("well");
docElem.appendChild(node);

 

13、QDomProcessingInstruction createProcessingInstruction(const QString &target, const QString &data)

创建可以插入文档的新处理指令。该函数将处理指令的目标设置为target,将数据设置为data。

如果目标不是有效的 XML 名称,或者数据如果包含不能出现在处理指令中的字符,则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

可参考:XML DOM - ProcessingInstruction 对象

14、QDomText createTextNode(const QString &value)

创建一个文本节点。

如果 value 包含不能存储为 XML 文档的字符数据的字符(即使以字符引用的形式),则此函数的行为由 QDomImplementation::InvalidDataPolicy 控制。

QDomElement docElem = doc.documentElement();
auto node = doc.createTextNode("well");
docElem.appendChild(node);

15、QDomDocumentType doctype()

返回此文档的文档类型。

16、QDomElement documentElement()

返回文档的根元素。

17、QDomNodeList elementsByTagName(const QString &tagname)

返回一个 QDomNodeList,它包含文档中名称为 tagname 的所有元素。节点列表的顺序是它们在元素树的先序遍历中遇到的顺序。

 

QDomElement docElem = doc.documentElement();
QDomNodeList list = doc.elementsByTagName("a");
for(int i = 0;i < list.count();++i)
{
QDomElement e = list.at(i).toElement();
qDebug()<<e.attribute("attr");
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

18、QDomNodeList elementsByTagNameNS(const QString &nsURI, const QString &localName)

返回一个 QDomNodeList,其中包含文档中具有本地名称 localName 和 nsURI 的命名空间 URI 的所有元素。节点列表的顺序是它们在元素树的先序遍历中遇到的顺序。

19、QDomNode importNode(const QDomNode &importedNode, bool deep)

将节点importedNode 从另一个文档导入到当前文档。此函数创建可在此文档中使用的副本。

该函数返回属于该文档的导入节点。 返回的节点没有父节点。

如果 deep 为真,则该函数不仅导入节点importedNode,还导入其整个子树。如果为false,则仅导入importedNode。参数 deep 对 QDomAttr 和 QDomEntityReference 节点没有影响,因为 QDomAttr 节点的后代总是被导入而 QDomEntityReference 节点的后代永远不会被导入。

根据节点类型,此函数的行为略有不同:

  • QDomAttr:在生成的属性中,owner 元素设置为 0,指定标志设置为 true。始终为属性节点导入importNode 的整个子树:deep 无效。
  • QDomDocument:无法导入文档节点。
  • QDomDocumentFragment:如果 deep 为真,则该函数导入整个文档片段,否则它只会生成一个空的文档片段。
  • QDomDocumentType:文档类型节点无法导入。
  • QDomElement:仅导入 QDomAttr::specified() 为 true 的属性,不导入其他属性。如果 deep 为真,则该函数还导入了importedNode 的子树;否则它只导入元素节点。
  • QDomEntity:实体节点可以导入,但无法使用。
  • QDomEntityReference:实体引用节点的后代不会被导入,deep 没有效果。
  • QDomNotation:Notation 节点可以被导入,但目前没有办法使用它们。
  • QDomProcessingInstruction:将处理指令的目标和值复制到新节点。
  • QDomText:将文本复制到新节点。
  • QDomCDATASection:将文本复制到新节点。
  • QDomComment:将文本复制到新节点。

20、bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)

bool setContent(QIODevice *dev, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)

从字节数组/设备数据中解析 XML 文档并将其设置为文档的内容。它尝试按照 XML 规范的要求检测文档的编码。

如果namespaceProcessing 为true,解析器会识别XML 文件中的名称空间并将前缀名称、本地名称和名称空间URI 设置为适当的值。如果 namespaceProcessing 为 false,则解析器在读取 XML 文件时不进行命名空间处理。

如果发生解析错误,该函数返回false,错误信息放在*errorMsg 中,*errorLine 中的行号和*errorColumn 中的列号(除非关联的指针设置为0);否则此函数返回真。 QXmlParseException 类文档中描述了各种错误消息。请注意,如果您想向应用程序的用户显示这些错误消息,除非明确翻译,否则它们将以英文显示。

如果namespaceProcessing 为true,则函数QDomNode::prefix() 返回所有元素和属性的字符串。如果元素或属性没有前缀,则返回空字符串。

仅由空格组成的文本节点将被剥离并且不会出现在 QDomDocument 中。如果不需要这种行为,可以使用允许提供 QXmlReader 的 setContent() 重载。

21、bool setContent(const QString &text, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)

bool setContent(const QString &text, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)

重载函数。由于文本已经是 Unicode 字符串,因此没有进行编码检测。

22、bool setContent(QXmlStreamReader *reader, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)

重载函数。该函数从 QXmlStreamReader 读取 XML 文档并对其进行解析。

23、QByteArray toByteArray(int indent = 1)

将解析后的文档转换回其文本表示,并返回包含编码为 UTF-8 的数据的 QByteArray。

使用 indent 作为缩进子元素的缩进量。

24、QString toString(int indent = 1)

将解析后的文档转换回其文本表示。使用 indent 作为缩进子元素的缩进量。如果缩进为 -1,则不添加空格。

QDomNode

一、描述

QDomNode是文档树的节点。

QDomNode 类的副本使用显式共享来共享它们的数据。这意味着修改一个节点将更改所有副本。

下面的示例查找 XML 文档中的第一个元素并打印作为其直接子元素的所有元素的名称。

QDomDocument d;
d.setContent(someXML);
QDomNode n = d.firstChild();
while (!n.isNull())
{
if (n.isElement())
{
QDomElement e = n.toElement();
cout << "Element name: " << e.tagName() << Qt::endl;
break;
}
n = n.nextSibling();
}

二、类型成员

1、enum QDomNode::EncodingPolicy:此枚举指定 save() 如何确定序列化时使用的编码。

  • EncodingFromDocument:编码是从文档中获取的。
  • EncodingFromTextStream:编码是从 QTextStream 中获取的。

2、enum QDomNode::NodeType:节点类型。

ElementNode
AttributeNode
TextNode
CDATASectionNode
EntityReferenceNode
EntityNode
ProcessingInstructionNode
CommentNode
DocumentNode
DocumentTypeNode
DocumentFragmentNode
NotationNode
BaseNode
CharacterDataNode

三、成员函数

1、QDomNode(const QDomNode &n)

QDomNode & operator=(const QDomNode &n)

副本的数据是共享的(浅拷贝):修改一个节点也会改变另一个。 如果要进行深度复制,请使用 cloneNode()。

2、QDomNode appendChild(const QDomNode &newChild)

附加 newChild 作为节点的最后一个子节点。

  • 如果 newChild 是另一个节点的子节点,则它会重新成为该节点的父节点。
  • 如果 newChild 是当前节点的子节点,那么它在子节点列表中的位置就会改变。
  • 如果 newChild 是 QDomDocumentFragment,则片段的子元素将从片段中移除并附加。
  • 如果 newChild 是一个 QDomElement 并且这个节点是一个 QDomDocument 中的元素的子节点,则 newChild 不会被添加为子节点并返回一个空节点。

成功时返回对 newChild 的新引用,失败时返回空节点。

在空节点上调用此函数不执行任何操作并返回空节点。

3、QDomNamedNodeMap attributes()

返回所有属性的命名节点映射。属性仅为 QDomElements 提供。

更改QDomNamedNodeMap中的属性也会更改此 QDomNode 的属性。

4、QDomNodeList childNodes()

返回所有直接子节点的列表。更改列表中的节点也会更改当前节点的子节点。

5、void clear()

将节点转换为空节点。如果之前不是空节点,则删除其类型和内容。

6、QDomNode cloneNode(bool deep = true)

创建 QDomNode 的深副本。

如果 deep 为真,则克隆以递归方式完成,所有节点的子节点也被深度复制。 如果 deep 为 false,则仅复制节点本身,副本将没有子节点。

7、int columnNumber()

对于由 QDomDocument::setContent() 创建的节点,此函数返回 XML 文档中解析节点的列号。 否则,返回-1。

8、QDomNode firstChild()

返回节点的第一个子节点。如果没有子节点,则返回空节点。 更改返回的节点也会更改文档树中的节点。

9、QDomElement firstChildElement(const QString &tagName = QString())

如果 tagName 非空,则返回第一个带有标签名称 tagName 的子元素; 否则返回第一个子元素。 如果不存在这样的子元素,则返回空元素。

10、bool hasAttributes()

节点是否具有属性。

11、bool hasChildNodes()

节点是否有子节点。

12、QDomNode insertAfter(const QDomNode &newChild, const QDomNode &refChild)

在子节点 refChild 之后插入节点 newChild。 refChild 必须是此节点的直接子节点。

  • 如果 refChild 为 null,则将 newChild 作为当前节点的最后一个子节点附加。
  • 如果 newChild 是另一个节点的子节点,则它会重新成为该节点的父节点。
  • 如果 newChild 是当前节点的子节点,那么它在子节点列表中的位置就会改变。
  • 如果 newChild 是 QDomDocumentFragment,则片段的子级将从片段中移除并插入到 refChild 之后。

成功时返回对 newChild 的新引用,失败时返回空节点。

13、QDomNode insertBefore(const QDomNode &newChild, const QDomNode &refChild)

在子节点 refChild 之前插入节点 newChild。refChild 必须是此节点的直接子节点。

  • 如果 refChild 为 null,则将 newChild 作为节点的第一个子节点插入。
  • 如果 newChild 是另一个节点的子节点,则它会重新成为该节点的父节点。
  • 如果 newChild 是这个节点的子节点,那么它在子节点列表中的位置就会改变。
  • 如果 newChild 是 QDomDocumentFragment,则片段的子元素将从片段中移除并插入到 refChild 之前。

成功时返回对 newChild 的新引用,失败时返回空节点。

14、QDomNode lastChild()

返回节点的最后一个子节点。如果没有子节点,则返回空节点。更改返回的节点也会更改文档树中的节点。

15、QDomElement lastChildElement(const QString &tagName = QString())

如果 tagName 不为空,则返回带有标签名称 tagName 的最后一个子元素。否则返回最后一个子元素。 如果不存在这样的子元素,则返回空元素。

16、int lineNumber()

对于由 QDomDocument::setContent() 创建的节点,此函数返回 XML 文档中解析节点的行号。 否则,返回-1。

17、QString localName()

如果节点使用命名空间,该函数返回节点的本地名称;否则它返回一个空字符串。

只有 ElementNode 或 AttributeNode 类型的节点才能拥有命名空间。必须在创建时指定命名空间; 之后无法添加命名空间。

18、QDomNode namedItem(const QString &name)

返回 nodeName() 等于 name 的第一个直接子节点。如果不存在这样的直接子节点,则返回空节点。

19、QString namespaceURI()

如果节点没有命名空间 URI,则返回此节点的命名空间 URI 或空字符串。

只有 ElementNode 或 AttributeNode 类型的节点才能拥有命名空间。

20、QDomNode nextSibling()

QDomNode previousSibling()

返回文档树中的下一个 / 上一个同级。 更改返回的节点也会更改文档树中的节点。

如这样的XML:

<h1>Heading</h1>
<p>The text...</p>
<h2>Next heading</h2>

如果当前 QDomNode 代表 <p> 标签,nextSibling() 将返回代表 <h2> 标签的节点。previousSibling()将返回代表 <h1> 标签的节点。

21、QDomElement nextSiblingElement(const QString &tagName = QString())

QDomElement previousSiblingElement(const QString &tagName = QString())

如果 tagName 非空,则返回下一个 / 上一个具有标签名称 tagName 的同级元素。否则返回任何下一个 / 上一个兄弟元素。 如果不存在这样的兄弟,则返回空元素。

22、QString nodeName()

返回节点的名称。名称的含义取决于子类:

  • QDomAttr:属性名称
  • QDomCDATASection:"#cdata-section"
  • QDomComment:"#comment"
  • QDomDocument:"#document"
  • QDomDocumentFragment:"#document-fragment"
  • QDomDocumentType:文档类型名称
  • QDomElement:标签名称
  • QDomEntity:实体名称
  • QDomEntityReference:引用实体的名称
  • QDomNotation:符号名称
  • QDomProcessingInstruction:处理指令的目标
  • QDomText:"#text"

注意:此函数在处理元素和属性节点的名称时不考虑名称空间的存在。因此,返回的名称可以包含任何可能存在的命名空间前缀。

要获取元素或属性的节点名称,请使用 localName()。

要获取命名空间前缀,请使用 namespaceURI()。

23、QString nodeValue() / void setNodeValue(const QString &v)

返回 / 设置节点的值。值的含义取决于子类:

  • QDomAttr:属性值
  • QDomCDATASection:CDATA 部分的内容
  • QDomComment:注释
  • QDomProcessingInstruction:处理指令的数据
  • QDomText:文本

所有其他子类都没有节点值,将返回一个空字符串。

24、void normalize()

将所有子元素转换为标准形式。这意味着相邻的 QDomText 对象将合并为单个文本对象(QDomCDATASection 节点不会合并)。

25、QDomDocument ownerDocument()

返回此节点所属的文档。

26、QDomNode parentNode()

返回父节点。如果此节点没有父节点,则返回一个空节点(即 isNull() 返回 true 的节点)。

27、QString prefix() / void setPrefix(const QString &pre)

返回 / 设置节点的命名空间前缀或空字符串。

只有 ElementNode 或 AttributeNode 类型的节点才能拥有命名空间。 必须在创建时指定命名空间前缀。如果节点是使用命名空间前缀创建的,可以使用 setPrefix() 更改它。

28、QDomNode removeChild(const QDomNode &oldChild)

从子项列表中删除 oldChild。 oldChild 必须是此节点的直接子节点。成功时返回对 oldChild 的新引用,失败时返回空节点。

29、QDomNode replaceChild(const QDomNode &newChild, const QDomNode &oldChild)

用 newChild 替换 oldChild。 oldChild 必须是此节点的直接子节点。

  • 如果 newChild 是另一个节点的子节点,则它会重新成为该节点的父节点。
  • 如果 newChild 是这个节点的子节点,那么它在子节点列表中的位置就会改变。
  • 如果 newChild 是 QDomDocumentFragment,则 oldChild 被该片段的所有子级替换。

成功时返回对 oldChild 的新引用,失败时返回空节点。

30、void save(QTextStream &stream, int indent, QDomNode::EncodingPolicy encodingPolicy = QDomNode::EncodingFromDocument)

将节点及其所有子节点的 XML 存入写入流。indent作为缩进量。

如果文档包含无效的 XML 字符或无法以给定编码进行编码的字符,则结果和行为未定义。

31、bool operator==(const QDomNode &n)

如果 n 和此 DOM 节点相等,则返回 true; 否则返回false。

QDomNode 的任何实例都充当对 QDomDocument 中底层数据结构的引用。相等性测试检查两个引用是否指向同一个底层节点。例如:

QDomDocument document;
QDomElement element1 = document.documentElement();
QDomElement element2 = element1;

这两个节点(QDomElement 是 QDomNode 的子类)都引用了文档的根元素,并且 element1 == element2 将返回 true。 另一方面:

QDomElement element3 = document.createElement("MyElement");
QDomElement element4 = document.createElement("MyElement");

即使两个节点都是具有相同名称的空元素, element3 == element4 也会返回 false,因为它们引用底层数据结构中的两个不同节点。

32、bool isNull()

此节点是否为 null(即如果它没有类型或内容)。

四、相关非成员

1、QTextStream &operator<<(QTextStream &str, const QDomNode &node)

将节点节点及其所有子节点的 XML 表示写入流 str。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

原文链接:https://blog.csdn.net/kenfan1647/article/details/118757054

原文链接:https://blog.csdn.net/kenfan1647/article/details/118858431

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Qt的QtCore和QtXml模块来读写XML文件。下面是一个简单的示例代码,展示了如何使用Qt读取XML文件和写入XML文件: ```cpp #include <QtXml/QtXml> #include <QtCore/QFile> #include <QtCore/QIODevice> int main() { // 读取XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open XML file for reading."; return -1; } QDomDocument doc; if (!doc.setContent(&file)) { qDebug() << "Failed to parse XML."; file.close(); return -1; } file.close(); // 遍历XML数据 QDomElement root = doc.documentElement(); QDomNodeList nodes = root.childNodes(); for (int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); if (node.isElement()) { QDomElement element = node.toElement(); qDebug() << "Element name:" << element.tagName(); qDebug() << "Element value:" << element.text(); } } // 写入XML文件 QFile outputFile("output.xml"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open output XML file."; return -1; } QTextStream stream(&outputFile); doc.save(stream, 4); // 缩进为4个空格 outputFile.close(); return 0; } ``` 上述示例代码首先打开一个XML文件进行读取,然后使用`QDomDocument`类解析XML数据。通过遍历`QDomDocument`对象的子节点,可以获得每个元素的标签名和文本值。最后,将解析后的XML数据保存到新的XML文件中。 请注意,上述代码中使用的XML文件名为"example.xml"和"output.xml",你可以根据自己的需要修改这些文件名。此外,你需要在.pro文件中添加`QT += xml`以包含QtXml模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值