我知道我可能在这里遗漏了一些非常明显的东西,但这几天来一直让我抓狂。
下面是我编写的一个简单函数,它目前只是用来查找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,但我不确定为什么会出现这种情况。
发布于 2018-09-28 03:17:33
正如@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();
https://stackoverflow.com/questions/52543335
复制相似问题