一、描述

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。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐