c++ - 为什么 TinyXML2 的 XMLDocument::FirstChild() 函数在尝试解析这个有效的 XML 文件时返回 NULL?

标签 c++ xml tinyxml2

我知道这里可能缺少一些非常明显的东西,但这几天让我发疯了。

这是我编写的一个简单函数,它现在应该只是在 XML 文档中找到第一个标记:

void parse_weather_file(const char* weatherFileName, WeatherDataAsPWMValues *wd)
{
    if (wd == NULL) return;

    std::cout << weatherFileName << std::endl;

    tinyxml2::XMLDocument doc(weatherFileName);
    tinyxml2::XMLNode *root = doc.FirstChild();
    if (root == NULL) std::cout << "Error" << std::endl;
}

这是我要解析的 XML 文档:

<!-- Sample output of openWeatherMap API -->
<?xml version="1.0" encoding="utf-8"?>
<current>
    <city id="2643741" name="City of London">
        <coord lon="-0.09" lat="51.51">
        <country>GB</country>
    <sun rise="2015-06-30T03:46:57" set="2015-06-30T20:21:12">
    </city>
    <temperature value="72.34" min="66.2" max="79.88" unit="fahrenheit"/>
    <humidity value="43" unit="%">
    <pressure value="1020" unit="hPa">
    <wind>
        <speed value="7.78" name="Moderate breeze">
        <direction value="140" code="SE" name="SouthEast">
    </wind>
    <clouds value="0" name="clear sky">
    <visibility value="10000">
    <precipitation mode="no">
    <weather number="800" value="Sky is Clear" icon="01d">
    <lastupdate value="2015-06-30T08:36:14">
</current>

这是我从函数中得到的输出:

test.xml
Error

这表明 root 在函数末尾为 NULL,但我不确定为什么会这样。

最佳答案

正如@zx485 所解释的,您的 XML 格式不正确。但是,即使在修复之后,您的代码仍然会失败。根据 TinyXML-2 documentation , tinyxml2::XMLDocument 类没有接受文件名作为输入的构造函数。但是,它确实有一个接受 bool 作为输入的构造函数:

XMLDocument( bool processEntities = true, Whitespace whitespaceMode = PRESERVE_WHITESPACE );

const char* 可以隐式转换为 bool,这就是为什么您的代码可以编译,但您实际上根本没有加载文件,这就是为什么 root 为 NULL。

您需要改为调用类的 LoadFile() 方法:

XMLError LoadFile( const char* filename );

例如:

void parse_weather_file(const char* weatherFileName, WeatherDataAsPWMValues *wd)
{
    if (wd == NULL) return;

    std::cout << weatherFileName << std::endl;

    tinyxml2::XMLDocument doc;

    XMLError err = doc.LoadFile(weatherFileName);
    if (err != XML_SUCCESS) {
        std::cout << "Error loading file: " << (int)err << std::endl;

        /* or:

        std::cout << "Error loading file: " << doc.ErrorName() << std::endl;

        std::cout << "Error loading file: " << tinyxml2::XMLDocument::ErrorIDToName(err) << std::endl;

        std::cout << "Error loading file: " << doc.ErrorStr() << std::endl;

        std::cout << "Error loading file" <<< endl;
        doc.PrintError();

        */

        return;
    }

    tinyxml2::XMLNode *root = doc.FirstChild();
    if (root == NULL) {
        std::cout << "Error root is null" << std::endl;
        return;
    }

    // use root as needed...
}

此外,您应该使用 RootElement() 方法而不是 FirstChild() 方法:

tinyxml2::XMLElement *root = doc.RootElement();

关于c++ - 为什么 TinyXML2 的 XMLDocument::FirstChild() 函数在尝试解析这个有效的 XML 文件时返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52543335/

相关文章:

c++ - tinyxml2 在 C++ 上构建和写入 xml 文件

c++ - 使用 TinyXML 读取所有兄弟元素

c++ - 使用 mciSendString (MCIERR_CANNOT_LOAD_DRIVER) 播放 mp3 文件

c++ - #define 在 C 中没有标记且没有#ifdef 的标识符

javascript - jQuery:如何访问具有特定属性的 XML 文件中的元素?

c# - XML 比较,用于检查窗口应用程序是否相同或不同

c++ - 在 tinyxml2 中添加文本

c++ - 将 Windows 上的文件共享用于数据库时,它的可靠性如何?

c++ - 为什么不转换在模板类中调用的构造函数?

python - 如何使用 Python 库验证 XML 文件时出现多个错误?