2

次のようなxmlファイルを解析すると、rapidxmlで奇妙なエラーが発生します

<?xml version="1.0" encoding="UTF-8"?>
<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />

「expected >」をスローします。次のようなコードを使用してデータを解析しています

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 ラグの「/」記号が問題ではないようです。これはrapidxmlのバグですか、それとも何か間違っていますか?

4

3 に答える 3

2

XML データを vector にロードする方法が間違っています。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を参照してください。この動作の根拠はパフォーマンスです。終了タグの検証には時間がかかり、ほとんどの場合必要ありません。

于 2011-07-16T01:02:14.030 に答える
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

于 2011-04-19T14:55:18.713 に答える
0

XMLは有効です。コードとXMLが投稿したとおりである場合は、rapidxmlのバグである必要があります。/>複数行間の属性リストの分割をサポートしていないか、タグの終わりをサポートしていない可能性が低いと思います。

于 2011-04-19T14:06:52.913 に答える