【问题标题】:Qt xml file issues with content above root nodeQt xml 文件与根节点上方的内容有关
【发布时间】:2011-02-28 15:07:20
【问题描述】:

我在使用 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++。

编辑 1(基于帖子):

这就是我解析文件和导航 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();
}

请注意,这种方式不允许我处理 之上的节点...诸如 proc instr 和 DTD 节点之类的东西。当我将(QDomDocument 注释)写回文件时,文件中的 DTD 被删除。

编辑 2(基于帖子):

//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.
}

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    你如何读取文件并将其写回?

    对于处理指令和注释,可以遍历 QDomDocument::childNodes() 得到所有顶级节点(包括根元素)。

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

    编辑:

    下面是迭代顶级节点的方法(注意 QDomDocument 是 QDomNode 本身):

    QDomDocument doc;
    ...
    QDomNodeList children = doc.childNodes();
    for ( int i=0; i < children.count(); ++i ) {
        QDomNode child = children.at( i );
        //do something with child...
    }
    

    【讨论】:

    • 我添加了您要求的信息。我看不到如何遍历子节点以获得顶级节点。
    • 谢谢。我用你的代码 sn-p 试过了,但它不起作用。它现在可以看到 proc 指令节点,但仍然...... dtd 节点对 Qt dom 仍然不可见。我无法处理 dtd 节点...此外, .doctype() 仅返回( 但随之而来的 dtd 定义丢失了。
    • doctype 对象是否有子节点?也是一个dom节点。
    • Frank,它没有子节点。上面显示的代码。
    【解决方案2】:

    好的,我认为我的问题的答案是 Qt 无法处理内部 DTD。应该是……但似乎不是。

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多