Как импортировать данные XML в Qt - PullRequest
1 голос
/ 02 мая 2011

Я не совсем понимаю, как импортировать данные из файла XML. Файл XML имеет следующую структуру:

<Workflow>
     <ItemList1>
         <Item1>1</Item1>
         <otherItem>1</otherItem>
         <anotherItem>1</anotherItem>
          ........................
     </ItemList1>
     <TaskLists>
        <NumberOfTasks>2</NumberOfTasks>
        <Task_1>
           <description>"description"</description>
           <position>"x, y"</position>
           <name>"name"</name>
           <tagListNumberOfItems>2</tagListNumberOfItems>
           <tagList>
              <subTag>"text"</subTag>
              <other_subTag>"text"</other_subTag>
           </tagList>
        </Task_1>
        <Task_2>
           <description>"description"</description>
           <position>"x,y"</position>
           <name>"name"</name>
           <tagListNumberOfItems>4</tagListNumberOfItems>
           <tagList>
              <different_subTag>"text"</different_subTag>
              <other_different_subTag>"text"</other_different_subTag>
              <a_3rd_subTag>"text"</a_3rd_subTag>
              <a_4th_subTag>"text"</a_4th_subTag>
           </tagList>
        </Task_2>
     </TaskLists>
</Workflow>

Как мне импортировать эти данные? Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 мая 2011

Самое простое - взглянуть на Пример закладки .Он использует QXmlStreamReader

Из документа:

   QXmlStreamReader xml;
   ...
   while (!xml.atEnd()) {
         xml.readNext();
         ... // do processing
   }
   if (xml.hasError()) {
         ... // do error handling
   }

Из примера:

bool XbelReader::read(QIODevice *device)
 {
     xml.setDevice(device);

     if (xml.readNextStartElement()) {
         if (xml.name() == "xbel" && xml.attributes().value("version") == "1.0")
             readXBEL();
         else
             xml.raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
     }

     return !xml.error();
 }


void XbelReader::readXBEL()
 {
     Q_ASSERT(xml.isStartElement() && xml.name() == "xbel");

     while (xml.readNextStartElement()) {
         if (xml.name() == "folder")
             readFolder(0);
         else if (xml.name() == "bookmark")
             readBookmark(0);
         else if (xml.name() == "separator")
             readSeparator(0);
         else
             xml.skipCurrentElement();
     }
 }

Вы можете использовать DOM, SAXили XmlStream.Взгляните Здесь приведено несколько примеров .

Таким образом, вы читаете xml и затем создаете / заполняете ваши объекты / время выполнения в зависимости от того, какой XML-файлпри условии.

2 голосов
/ 02 мая 2011

Посмотрите на модуль QtXml.

Я думаю, что этот класс будет делать то, что вам нужно: http://doc.qt.io/qt-5/qdomdocument.html

Позволяет загружать XML-файл в виде дерева, которое вы можете читать или изменять.

0 голосов
/ 02 мая 2011

Я знаю, что вы задаете этот вопрос, потому что вы нигде не можете получить рабочий пример кода для чтения XML-файла.Следующий код поможет вам сделать это.

QString fileName = "yourfile.xml";
QFile file(fileName);
if(file.exists()) {

    QDomDocument doc( "XMLFile" );
    if( !file.open( QIODevice::ReadOnly ) )
        return false;
    if( !doc.setContent( &file ) )
    {
        file.close();
        return false;
    }
    file.close();
    QDomElement root = doc.documentElement();
    QDomNode n = root.firstChild();
    while( !n.isNull() )
    {
        QDomElement e = n.toElement();
        if( !e.isNull() )
        {
            qDebug() << e.tagName(); //this gives you the name of the tag
            qDebug() << e.namedItem("ChildTag").toElement().text(); //this gives you the node value of a tag.

        }
        n = n.nextSibling();
    }
} else {
    return false;
}
return false;
}
...