QtXml:QDomNode
一、描述QDomNode是文档树的结点。QDomNode 类的副本使用显式共享来共享它们的数据。这意味着修改一个节点将更改所有副本。下面的示例查找 XML 文档中的第一个元素并打印作为其直接子元素的所有元素的名称。QDomDocument d;d.setContent(someXML);QDomNode n = d.firstChild();while (!n.isNull()){if (n.is
一、描述
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。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)