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 ;
}