【问题标题】:How to import XML data in Qt如何在 Qt 中导入 XML 数据
【发布时间】:2011-05-02 14:04:18
【问题描述】:

我对如何从 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>

我应该如何导入这些数据? 谢谢!

【问题讨论】:

    标签: xml qt qtxml


    【解决方案1】:

    最简单的方法是查看Bookmark Example。它利用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。看看Here for a couple of examples

    因此,您读取 xml,然后根据 XML 文件提供的内容创建/填充您的对象/运行时

    【讨论】:

      【解决方案2】:

      看看 QtXml 模块。

      我认为这个类会满足你的需要: http://doc.qt.io/qt-5/qdomdocument.html

      它允许您将 XML 文件加载为可以读取或修改的树。

      【讨论】:

        【解决方案3】:

        我知道您在问这个问题是因为您无法在任何地方获得工作示例代码来读取 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-01
          • 1970-01-01
          • 2012-10-31
          • 2017-02-06
          • 1970-01-01
          • 2019-08-04
          • 2017-07-12
          • 2023-03-03
          相关资源
          最近更新 更多