1 QXML类概述
类 |
描述 |
QDomAttr |
表示 QDomElement 的一个属性 |
QDomCDATASection |
表示一个 XML CDATA 片段 |
QDomCharacterData |
表示 DOM 中的通用字符串 |
QDomComment |
表示 XML 注释 |
QDomDocument |
表示一个 XML 文档 |
QDomDocumentFragment |
一组 QDomNodes,通常不是完整的 QDomDocument |
QDomDocumentType |
DTD 在文档树中的表示 |
QDomElement |
代表 DOM 树中的一个元素 |
QDomEntity |
代表一个 XML 实体 |
QDomEntityReference |
表示 XML 实体引用 |
QDomImplementation |
有关 DOM 实现功能的信息 |
QDomNamedNodeMap |
包含可以通过名称访问的节点集合 |
QDomNode |
DOM 树中所有节点的基类 |
QDomNodeList |
QDomNode 对象列表 |
QDomNotation |
表示 XML 符号 |
QDomProcessingInstruction |
表示一条 XML 处理指令 |
QDomText |
表示解析的 XML 文档中的文本数据 |
QXmlAttributes |
XML 属性 |
QXmlContentHandler |
用于报告 XML 数据逻辑内容的接口 |
QXmlDTDHandler |
用于报告 XML 数据的 DTD 内容的接口 |
QXmlDeclHandler |
XML数据声明内容上报接口 |
QXmlDefaultHandler |
所有 XML 处理程序类的默认实现 |
QXmlEntityResolver |
用于解析 XML 数据中包含的外部实体的接口 |
QXmlErrorHandler |
用于报告 XML 数据错误的接口 |
QXmlInputSource |
XmlReader 子类的输入数据 |
QXmlLexicalHandler |
报告 XML 数据词法内容的接口 |
QXmlLocator |
包含有关文件中解析位置信息的 XML 处理程序类 |
QXmlNamespaceSupport |
用于希望包含命名空间支持的 XML 阅读器的类 |
QXmlParseException |
使用 QXmlErrorHandler 接口报告错误 |
QXmlReader |
XML 阅读器(即解析器)的接口 |
QXmlSimpleReader |
一个简单的 XML 解析器的实现 |
2 XML示例
2.1 示例1
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag id="1">
<name>test1</name>
<value>100</value>
</tag>
<tag id="1">
<name>test2</name>
<value>100</value>
</tag>
</root>
- 说明:
1 节点名:root、tag、value、type
2 属性:id
3 文本:test1
4 元素:一对标签囊括的内容
3 XML节点说明
QTXml的结构如图所示,解析、生成xml的用到的类有QDomDocument、QDomElement、QDomAttr。
3.1QDomNode
-
描述:是 DOM 树中所有节点的基类.
-
API及功能
1 appendChild、insertAfter、insertBefore、removeChild、replaceChild:在最后插入一个新的子节点、在指定子节点之后插入新的子节点、在指定子节点之前插入新的子节点、删除子节点、替换子节点。
2 childNodes:返回字节的列表。
3 clear:将节点转换为空节点; 如果之前不是空节点,则删除其类型和内容。
4 cloneNode:复制当前节点的副本,其参数deep deep 为真,则克隆以递归方式完成,这意味着所有节点的子节点也被深度复制。 如果 deep 为 false,则仅复制节点本身,并且副本将没有子节点。
5 firstChild、lastChild、firstChildElement、lastChildElement:第一个子节点(元素、属性、文本……)、最后一个子节点(元素、属性、文本……)、第一个子元素、最后一个子元素。
6 isAttr、isComment、isDocument、isElement、isText等:判断当前节点的类型。
7 toAttr、toComment、toDocument、toElement、toText等:转换当前节点的类型。
8 namedItem:根据节点名获取当前节点的一级子节点。
9 nextSibling、previousSibling、nextSiblingElement、previousSiblingElement:获取下一个兄弟节点、获取上一个兄弟节点、获取下一个[指定参数名的]兄弟元素、获取上一个[指定参数名的]兄弟元素。
10 nodeName:获取节点名。
11 nodeType:获取节点类型,具体值如下:
12 parentNode:父节点。
13 save:保存到文件流,第二个参数指定了缩进格式,第三个参数为编码格式(默认UTF-8)。
14 nodeValue、setNodeValue:获取节点的值、设置节点的值。不同类型的节点,值得含义如下,其他类型返回空字符串:
节点类型 |
描述 |
QDomAttr |
属性值 |
QDomCDATASection |
CDATA 部分的内容 |
QDomComment |
注释 |
QDomProcessingInstruction |
处理指令的数据 |
QDomText |
文本信息 |
3.2 QDomDocument
-
描述:表示整个 XML 文档。 从概念上讲,它是文档树的根,并提供对文档数据的主要访问。QDomElement、QDomText、QDomComment、处理指令等不能存在于QDomDocument的上下文之外,QDomDocument包含创建这些对象所需的工厂函数。
-
注意:解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问这些对象树。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除。
-
API及功能
1 createAttribute、createComment、createElement、createTextNode等:创建对应的数据类型对象。
2 elementById、elementsByTagName:根据条件获取一个或多个xml元素
3 documentElement:返回文档的根元素
4 setContent:此函数从字节数组(或字符串)数据中解析 XML 文档并将其设置为文档的内容,它尝试按照 XML 规范的要求检测文档的编码。
5 toString:将解析后的文档转换回其文本表示,此函数的参数作为缩进子元素的空间量。
-
补充说明:creat对象不会将此对象加入此对象树,需要 appendChild() 函数来添加字节点
3.3 QDomElement
-
描述:代表 DOM 树中的一个元素。
-
API及功能
1 attribute、attributeNode、attributes:根据属性名获取属性值、根据属性名获取属性节点、获取该节点的属性节点列表
2 elementsByTagName:根据节点名获取该元素的子节点列表
3 setAttribute、removeAttribute:添加(修改)属性、删除属性
4 text:获取该元素的文本值,若没有则返回空字符串。e.g 示例1 <name>test1</name>
调用此接口返回test1
3.4 QDomAttr
-
描述:代表 QDomElement 的一个属性。
-
API及功能:
1 name:属性名
2 value:属性值
3 ownerElement:所属元素
3.5 QDomText
4 使用示例
4.1 pro配置
QT += core xml
4.2 加载并解析xml
#include <iostream>
#include <QFile>
#include <QDomDocument>
using namespace std;
static int iLevel = 0;
void ParseXmlNode(const QDomNode &clsEle)
{
++iLevel;
QString strEleName = clsEle.nodeName();
cout << "\nlevel = " << iLevel << " "
<< strEleName.toStdString() << " type = " << clsEle.nodeType()
<< " value = " << clsEle.nodeValue().toStdString() << endl;
if(clsEle.hasAttributes())
{
QDomNamedNodeMap mapAttrs = clsEle.attributes();
for(int i = 0, iSize = mapAttrs.count(); i < iSize; ++i)
{
cout << "attr" << i << " node type = " << mapAttrs.item(i).nodeType()
<< " " << mapAttrs.item(i).nodeName().toStdString()
<< " = " << mapAttrs.item(i).nodeValue().toStdString() << endl;
}
}
QDomNodeList lstChildren = clsEle.childNodes();
for (int i = 0, iSize = lstChildren.size(); i < iSize; ++i)
{
ParseXmlNode(lstChildren.at(i));
}
--iLevel;
}
int main()
{
QFile file("test.xml");
if(!file.exists())
{
return 0;
};
QDomDocument dom;
if(!dom.setContent(&file))
{
return 0;
}
QDomElement domRoot = dom.documentElement();
ParseXmlNode(domRoot);
getchar();
return 0;
}
4.2 构建并保存xml
#include <iostream>
#include <QFile>
#include <QDomDocument>
#include <QMap>
using namespace std;
int main()
{
QDomDocument clsDoc;
QDomProcessingInstruction xmlProcess = clsDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
clsDoc.appendChild(xmlProcess);
QDomElement clsRoot = clsDoc.createElement("root");
QMap<QString, int> mapData{{"test1", 100}, {"test2",100}};
QMap<QString, int>::const_iterator itCur = mapData.begin();
QMap<QString, int>::const_iterator itEnd = mapData.end();
for (int i = 0; itCur != itEnd; ++itCur, ++i)
{
QDomElement clsTag = clsDoc.createElement("tag");
QDomElement clsName = clsDoc.createElement("name");
QDomElement clsValue = clsDoc.createElement("value");
clsTag.setAttribute("id", QString::number(1));
clsName.appendChild(clsDoc.createTextNode(itCur.key()) );
clsValue.appendChild(clsDoc.createTextNode(QString::number(itCur.value())) );
clsTag.appendChild(clsName);
clsTag.appendChild(clsValue);
clsRoot.appendChild(clsTag);
}
clsDoc.appendChild(clsRoot);
QString strText = clsDoc.toString(2);
QFile clsFile("test.xml");
clsFile.open(QFile::WriteOnly | QFile::Truncate);
clsFile.write(strText.toStdString().c_str(), strText.size());
clsFile.close();
getchar();
return 0;
}