使用TinyXML2在C ++中读取XML文件

林恩

我对在C ++中使用XML感到很陌生,并且试图解析要下载的文件列表。我正在使用的XML文件是通过PHP生成的,看起来像这样:

<?xml version="1.0"?>
<FileList>
  <File Name="xxx" Path="xxx" MD5="xxx" SHA1="xxx"/>
</FileList>

以下是我在C ++中使用的代码,这些代码是我通过一些在线教程(包含在某些全局函数中)提出的:

tinyxml2::XMLDocument doc;

doc.LoadFile("file_listing.xml");
tinyxml2::XMLNode* pRoot = doc.FirstChild();
tinyxml2::XMLElement* pElement = pRoot->FirstChildElement("FileList");
if (pRoot == nullptr)
{
    QString text = QString::fromLocal8Bit("Error text in french");
    //other stuff
}
else
{
    tinyxml2::XMLElement* pListElement = pElement->FirstChildElement("File");
    while (pListElement != nullptr)
    {
        QString pathAttr = QString::fromStdString(pListElement->Attribute("Path"));
        QString md5Attr = QString:: fromStdString(pListElement->Attribute("MD5"));
        QString sha1Attr = QString::fromStdString(pListElement->Attribute("SHA1"));

        QString currentPath = pathAttr.remove("path");
        QString currentMd5 = this->fileChecksum(currentPath, QCryptographicHash::Md5);
        QString currentSha1 = this->fileChecksum(currentPath, QCryptographicHash::Sha1);

        QFile currentFile(currentPath);

        if (md5Attr != currentMd5 || sha1Attr != currentSha1 || !currentFile.exists())
        {
            QString url = "url" + currentPath;
            this->downloadFile(url);
        }

        pListElement = pListElement->NextSiblingElement("File");
    }

问题是,我在下一行收到类似“访问冲突,这是nullptr”的错误:

tinyxml2::XMLElement* pListElement = pElement->FirstChildElement("File");

由于我在编码方面还远非专业人士,而且我已经在互联网上上下搜索,所以我希望这里的人可以为我提供一些指导。

祝大家有美好的一天。

凯西

我不知道您是否有C ++ 17,但是可以通过使用auto*if-init-expressions(或依靠可以将指针隐式转换为布尔值的事实)来消除很多噪音

您的代码的主要问题是您没有使用XMLElement*而是使用XMLNode该函数tinyxml2::XMLDocument::RootElement()自动为您获取最顶层的元素。

因为您在顶部有一个xml声明,所以FirstChild返回该声明……它没有任何子代,因此其余代码将失败。

通过使用RootElementtinyxml,您可以跳过任何前导的非元素节点(注释,文档类型等),<FileList>而是给您


    tinyxml2::XMLDocument doc;
    auto err = doc.LoadFile("file_listing.xml");
    if(err != tinyxml2::XML_SUCCESS) {
        //Could not load file. Handle appropriately.
    } else {
        if(auto* pRoot = doc.RootElement(); pRoot == nullptr) {
            QString text = QString::fromLocal8Bit("Error text in french");
            //other stuff
        } else {
            for(auto* pListElement = pRoot->FirstChildElement("File");
                pListElement != nullptr;
                pListElement = pListElement->NextSiblingElement("File"))
            {
                QString pathAttr = QString::fromStdString(pListElement->Attribute("Path"));
                QString md5Attr = QString:: fromStdString(pListElement->Attribute("MD5"));
                QString sha1Attr = QString::fromStdString(pListElement->Attribute("SHA1"));

                QString currentPath = pathAttr.remove("path");
                QString currentMd5 = this->fileChecksum(currentPath, QCryptographicHash::Md5);
                QString currentSha1 = this->fileChecksum(currentPath, QCryptographicHash::Sha1);

                QFile currentFile(currentPath);
                if(md5Attr != currentMd5 || sha1Attr != currentSha1 || !currentFile.exists()) {
                    QString url = "url" + currentPath;
                    this->downloadFile(url);
                }
            }
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中使用tinyxml2读取xml文件

来自分类Dev

使用tinyXML2库使用javascript加载HTML文件

来自分类Dev

使用TinyXml2提取子树XML字符串

来自分类Dev

如何使用tinyxml2从XML加载父实体和子实体?

来自分类Dev

TinyXML2似乎无法正确加载我的文件?

来自分类Dev

在C ++中读取XML文件

来自分类Dev

tinyxml2:如何知道从流缓冲区成功读取的字符数

来自分类Dev

tinyxml2:如何知道从流缓冲区成功读取的字符数

来自分类Dev

在C#中读取RDF / XML文件

来自分类Dev

在 c# wpf 中读取 xml 文件

来自分类Dev

C# 从 XML 文件中读取

来自分类Dev

使用JQuery读取XML文件中的标签

来自分类Dev

如何使用python从文件夹中读取xml文件?

来自分类Dev

使用Python直接从zip文件中读取xml文件

来自分类Dev

TinyXML2解析器C ++奇怪的标记

来自分类Dev

如何使用tinyxml2查询字符串属性?

来自分类Dev

C# XDocument 从 XML 文件中读取所有节点

来自分类Dev

从 xml 文件中读取特定字符串 c#

来自分类Dev

使用元素树从python中的文件读取XML数据

来自分类Dev

C ++读取XML文件的内容

来自分类Dev

从C盘读取XML文件

来自分类Dev

读取C#Xml文件

来自分类Dev

使用MSBuild读取XML文件

来自分类Dev

使用LINQ从XML文件读取

来自分类Dev

使用MSBuild读取XML文件

来自分类Dev

使用Perl读取XML文件

来自分类Dev

使用LINQ从XML文件读取

来自分类Dev

使用 Petl 读取 XML 文件

来自分类Dev

C ++从文件中读取