Проблемы с файлом Qt xml с содержимым выше корневого узла - PullRequest
1 голос
/ 28 февраля 2011

У меня проблемы с 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.
}

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

ОК, я думаю, что ответ на мой вопрос заключается в том, что Qt не способен работать с внутренним DTD.Так и должно быть ... но, похоже, это не так.

0 голосов
/ 28 февраля 2011

Как вы читаете файл и записываете его обратно?

Для инструкций по обработке и комментария вы можете перебрать QDomDocument :: childNodes (), чтобы получить все узлы верхнего уровня (включая корневой элемент).

Доступ к DTD можно получить через QDomDocument :: docType (). Вы можете создать новый QDomDocument с заданным типом документа (кажется, вам нужно будет сохранить объект QDomDocumentType от исходного документа) с помощью конструктора QDomDocument (const QDomDocumentType &).

Edit:

Вот как перебирать узлы верхнего уровня (обратите внимание, что 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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...