C++ Qt xml文件与根节点上的内容有关

C++ Qt xml文件与根节点上的内容有关,c++,qt,qt4,C++,Qt,Qt4,我在处理Qt DOM和XML文件的DTD时遇到了困难。 假设我们有一个类似于下面的xml文件。DTD被嵌入到文件中 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE notes [ <!ELEMENT (note+)> <!ELEMENT note (to,from,heading,message)> <!ELEMENT to (#PCDATA)> <!ELEM

我在处理Qt DOM和XML文件的DTD时遇到了困难。 假设我们有一个类似于下面的xml文件。DTD被嵌入到文件中

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE notes [
  <!ELEMENT (note+)>
  <!ELEMENT note (to,from,heading,message)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT message (#PCDATA)>
]>
<!-- modified w3schools example -->
<notes> 
   <note>
      <to>Megatron</to> 
      <from>Pele</from> 
      <heading>Match</heading> 
      <message>Make sure you bring the beer!</message> 
   </note>
</notes>

]>
威震天
贝利
火柴
一定要带啤酒来!
如何从文件中读取DTD,然后在编辑DOM树后将其写回同一文件

我遇到的问题是,如果我读取xml文件,我只会将根节点及其内容放入dom树中。因此,当我将dom树写回文件时,dom树上方的所有内容都将丢失!如何读取该内容并将其与修改后的dom树一起写回文件

<>我使用Qt 4.7和C++。< /P> 编辑1(基于帖子):

//Based on QDomDocument notes;
qout << notes.doctype() << endl;        //Only prints <!DOCTYPE notes
QDomDocumentType dt = notes.doctype();  
qout << "(QDomDocumentType dt) has child nodes: " << dt.hasChildNodes() <<endl; //False

QDomNodeList children = notes.childNodes();
for ( int i=0; i < children.count(); ++i ) {
   QDomNode child = children.at( i );
   //Only proc & element nodes show! DTD node does not exist according to this loop.
   qout << "Type of node is: " << child.nodeType() << endl; 
   qout << "Node is DTD: " << child.isDocumentType() << endl;  //False.
}
这就是我解析文件和浏览dom树的方式

QDomDocument notes;
if( !notes.setContent(&file) ){
    file.close();                                          
    return -1;
}
file.close();                                             

//Get root element.  
//.documentElement() skips proc instr and DTD!
QDomElement re = notes.documentElement();              
if( re.tagName() != "notes"){                          
    qerr << "Err: Root element is not NOTES." << endl;
    return -1;
}

nNote = re.firstChild();
while( !nNote.isNull() )
{
    QDomElement eNote = nNote.toElement();        
    if( !eNote.isNull() && eNote.tagName() == "note" ){
        //some work...
    }
    nNote = nNote.nextSibling();
}
qdom文档注释;
如果(!notes.setContent(&file)){
file.close();
返回-1;
}
file.close();
//获取根元素。
//.documentElement()跳过过程指令和DTD!
QdomeElement re=notes.documentElement();
如果(re.tagName()!=“notes”){

qerr如何读取文件并将其写回

对于处理指令和注释,可以迭代QDomDocument::childNodes()以获取所有顶级节点(包括根元素)

DTD可以通过QDomDocument::docType()访问。您可以使用QDomDocument(const QDomDocumentType&)构造函数创建具有给定文档类型的新QDomDocument(似乎您必须从原始文档中保留QDomDocumentType对象)

编辑:

//Based on QDomDocument notes;
qout << notes.doctype() << endl;        //Only prints <!DOCTYPE notes
QDomDocumentType dt = notes.doctype();  
qout << "(QDomDocumentType dt) has child nodes: " << dt.hasChildNodes() <<endl; //False

QDomNodeList children = notes.childNodes();
for ( int i=0; i < children.count(); ++i ) {
   QDomNode child = children.at( i );
   //Only proc & element nodes show! DTD node does not exist according to this loop.
   qout << "Type of node is: " << child.nodeType() << endl; 
   qout << "Node is DTD: " << child.isDocumentType() << endl;  //False.
}
下面是如何在顶级节点上迭代(注意,QDomDocument本身就是QDomNode):

qdomdock;
...
QDomNodeList children=doc.childNodes();
for(int i=0;i
好的,我想我的问题的答案是Qt无法处理内部DTD。它应该是……但似乎不是。

我添加了您要求的信息。我不知道如何迭代子节点以获得顶级节点。谢谢。我用您的代码片段尝试了它,但它不起作用。它可以看到proc指令现在,但仍然…dtd节点对Qt dom不可见。我无法获取dtd节点上的句柄…而且,.doctype()只返回(doctype对象是否有子节点?它也是dom节点。Frank,它没有子节点。上面是显示此情况的代码。