在解析像
这样的xml文件时,我遇到了一个与rapidxml有关的奇怪错误<?xml version="1.0" encoding="UTF-8"?>
<IMG align="left"
src="http://www.w3.org/Icons/WWW/w3c_home" />
抛出“预期&gt;”。 我使用如下代码来解析数据
std::fstream file("./test.xml");
std::istream_iterator<char> eos;
std::istream_iterator<char> iit (file);
std::vector<char> xml(iit, eos);
xml.push_back('\0');
xml_document<> doc;
doc.parse<0>(&xml[0]);
IMG抹布中的“/”符号似乎是个问题。这是一个quickxml错误还是我做错了什么?
答案 0 :(得分:1)
我只是出于好奇而尝试过。 RapidXml可能很快,但肯定不是很好
#include "rapidxml.hpp"
int main(int argc, char* args[])
{
using namespace rapidxml;
xml_document<> doc; // character type defaults to char
doc.parse<0>(args[1]); // 0 means default parse flags
}
调用它会产生各种有趣的业务:
正确接受:
$ ./test.exe "<hello>world</hello>"
$ ./test.exe '<?xml version="1.0" encoding="UTF-8"?> <IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" />'
正确拒绝
$ ./test.exe '<hello we="" / >'
terminate called after throwing an instance of 'rapidxml::parse_error'
what(): expected >
Aborted (core dumped)
错误接受:
$ ./test.exe '<hello we="close">world</die><zellq></die>'
$ ./test.exe '<hello we="close/">world</die><we horrible=""></don'\''t>'
YMMV
答案 1 :(得分:1)
将XML数据加载到向量中的方式是错误的。在C ++文本模式下,流默认设置了“skipws”标志,这会导致它们跳过输入中的所有空格。您可以通过检查向量的内容来验证这一点 - 它将丢失所有空格/结束行。这显然会导致解析器抱怨。
在流上取消设置skipws标志以获得正确的行为:
file.unsetf(ios::skipws);
或者,您可以使用rapidxml_utils.hpp中的文件类来加载文件:
using namespace rapidxml;
file<> file("test.xml");
xml_document<> doc;
doc.parse<0>(file.data());
可悲的是,使用C ++流加载文本文件非常棘手且充满了陷阱。
至于上面的 sehe 测试,“错误接受”的案例是设计的(我没有足够的声誉来为他的答案添加评论)。您需要使用“parse_validate_closing_tags”解析标志来使解析器检查结束标记名称是否与起始标记名称匹配:
doc.parse<parse_validate_closing_tags>(...);
请参阅rapidxml手册中的parse_validate_closing_tags。 这种行为的基本原理是性能 - 验证结束标记非常耗时,并且在大多数情况下不需要。
答案 2 :(得分:0)
您的XML有效。如果代码和XML与您发布的完全相同,那么它必须是一个rapidxml错误。我想它要么不支持在多行中断属性列表,要么不太可能,不支持/>
标记结束。