url属性的rapidxml解析错误

时间:2011-04-19 13:54:45

标签: c++ rapidxml

在解析像

这样的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错误还是我做错了什么?

3 个答案:

答案 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错误。我想它要么不支持在多行中断属性列表,要么不太可能,不支持/>标记结束。