QDomDocument类代表了一个XML文件


QDomDocument类代表整个的XML文件。概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法。


由于元素、文本节点、注释、指令执行等等不可能脱离一个文档的上下文,所以文档类也包含了需要用来创建这些对象的工厂方法。被创建的节点对象有一个ownerDocument()函数,它将对象与对象常见的文档上下文环境关联起来。DOM类中最常使用的是QDomNode、QDomDocument、QDomElement和QDomText。


解析后的XML文件在内部是通过一个对象树来表示的,对象树可以使用各种QDom类进行访问。所有的QDom类只引用内部树上的对象。一旦最后一个DOM树的QDom对象和QDocument本身被删除掉时,DOM树上的所有内部对象会被删除掉。


元素、文本节点等的创建是通过使用类提供的各种工厂方法完成的。使用QDom类的缺省构造函数只会生成空的对象,这些空的对象不能操作,也不能哈如到文档中。


QDomDocument类有一些创建文档数据的函数,例如:createElement(),createTextNode(),createComment(),createCDATASection(),


createProcessingInstruction(),createAttribute(),和createEntityReference().其中一些函数含有支持名字空间的版本,例如:createElementNS()和createAttributeNS().函数createDocumentFragment()用来持有文档的部分内容,这对于处理复杂文档很有用。


使用setContent设置文档的全部内容。该函数解析传入的XML文档字符串并创建代表文档的DOM树。根节点可以使用documentElement()得到。文档的文本呈现可以使用toString()函数得到。


可以使用importNode()将其它文档的节点插入到当前文档中。


你可以使用elementsByTagName()和elementsByTagNameNS()来获取所有元素中含有特定标签的列表。


QDom类的典型使用方法如下:


 


QDomDocument doc("mydocument");


QFile file("mydocument.xml");


if (!file.open(QIODevice::ReadOnly))


    return;


if (!doc.setContent(&file)) {

    file.close();


    return;


}


file.close();


 


//打印出最外层元素所有直接的子节点的元素名称


QDomElement docElem = doc.documentElement();


QDomNode n = docElem.firstChild();


while (!n.isNull()) {


    QDomElement e = n.toElement(); //将节点转换为元素


    if (!e.isNull()) {


        cout<<qPrintable(e.tagName())<<endl;


    }


    n = n.nextSibling();


}


 


// 在文档的结尾添加一个新的元素


QDomElement elem = doc.createElement("img");


elem.setAttribute("src", "myimage.png");


docElem.appendChild(elem);


 


一旦doc和elem出了范围,整个的代表XML文档的内部树都会删除掉。


 


使用DOM代码创建一个文档如下:


QDocument doc("MyML");


QDomElement root = doc.createElement("MyML");


doc.appendChild(root);


 


QDomElement tag = doc.createElement("Greeting");


root.appendChild(tag);


 


QDomText t = doc.createTextNode("Hello World");


tag.appendChild(t);


 


QString xml = doc.toString();