在QT中除了使用QJsonDocument 、QJsonObject、QJsonArray、QJsonValue 来支持json文件的读写外,还可以通过QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap来支持xml的读写。
使用xml前需要在pro文件中加入QT += xml。
然后读xml文件时,通过QDomDocument关联QFile来读取xml文件1内容,如下:
QDomDocument doc;
QFile file("test.xml");
file.open(QIODevice::ReadOnly);
doc.setContent(&file);
当QDomDocument关联Qfile成功后,就可以通过doc.toString()获取到xml的所有文本内容,同时通过QDomElement来获取到所有外部节点了,代码如下:
QDomElement ele = doc.documentElement(); //通过遍历节点根据节点id找到需要操作的节点,修改其属性。
QString svgXml = doc.toString();//将修改后的xml对象转为字符串
具体获取所有节点有两种方式:
方法1:通过ele.firstChild()拿到第一个节点,然后调用nextSibling拿到下一个节点。
方法2:通过ele.childNodes()直接拿到所有节点。
代码如下:
QDomNode n = ele.firstChild();
while ( !n.isNull() )
{
//...
n = n.nextSibling();
}
for (int i = 0; i < ele.childNodes().size(); ++i)
{
//...
}
拿到所有外部节点后,判断这个节点的类型,通过nodeType()获取节点类型,然后根据类型进行转换。
各类型如下:
enum NodeType {
ElementNode = 1,
AttributeNode = 2,
TextNode = 3,
CDATASectionNode = 4,
EntityReferenceNode = 5,
EntityNode = 6,
ProcessingInstructionNode = 7,
CommentNode = 8,
DocumentNode = 9,
DocumentTypeNode = 10,
DocumentFragmentNode = 11,
NotationNode = 12,
BaseNode = 21,// this is not in the standard
CharacterDataNode = 22 // this is not in the standard
};
转换方式如下;
QDomElement toElement() const; QDomAttr toAttr() const; QDomText toText() const; QDomCDATASection toCDATASection() const; QDomEntityReference toEntityReference() const; QDomEntity toEntity() const; QDomComment toComment() const; QDomDocument toDocument() const; QDomDocumentType toDocumentType() const; QDomDocumentFragment toDocumentFragment() const; QDomNotation toNotation() const; QDomProcessingInstruction toProcessingInstruction() const; QDomCharacterData toCharacterData() const;
根据类型转换后,可以通过nodeName()来获取节点名称,通过text()获取节点文本。通过attributes()获取节点中所有字段。
示例如下:
for (int i = 0; i < ele.childNodes().size(); ++i)
{
//对根节点可以取得其对应的子节点
QDomElement e = ele.childNodes().at(i).toElement();
if( !e.isNull())
{
if(e.nodeName() == "title")
{
QDomElement echild = e.toElement();
qDebug()<<"---title-----"<<e.nodeName()<<e.nodeType()<<echild.text()<<echild.attributes().count();
QDomNamedNodeMap map = echild.attributes();
for (int i = 0; i < map.count(); ++i)
{
QDomNode node = map.item(i);
qDebug()<<node.toAttr().nodeName()<<node.toAttr().nodeValue();
}
}
}
这个示例中为什么我会转为QDomElement,因为我已经通过nodeType()知道它的类型了。
还有我为什么使用QDomNamedNodeMap map = echild.attributes()来获取字段,因为我已经通过echild.attributes().count()的大小知道它存在字段了。