У меня проблемы с Qt DOM и DTD XML-файла.Допустим, у нас есть 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.
}