0

XMPP を expat ライブラリで解析しようとしています。次のような入力ファイルがあります。

<iq from='ya.ru' to='foo@ya.ru/Foo1256' id='ping_1' type='get'><ping xmlns='urn:xmpp:ping'/></iq>

しかし、使用するたびに「整形式ではありません(無効なトークン)」というエラーが発生しますXML_Parse()。expat が「from=....」または「iq」タグの他の属性を解析しようとすると、エラーが発生することがわかりました。たとえば、次の文字列はエラーなしで解析されます。

<iq><ping xmlns='urn:xmpp:ping'/></iq>

なんで?

パーサーは で作成されXML_ParserCreateNS(NULL, '|');ます。

これは解析関数です:

bool CSessionTreeItem::setXMLForParser(char *buf, int Len, AnsiString &Error)
{
    bool error = false;
    for(int i = 0; i < Len; i ++)
        {
            if(i + 5 < Len)
                {
                    if(memcmp(buf + i, "<?xml", 5) == 0)
                    {
                            XML_ParserReset(parser, NULL);
                            InitHandlers();
                    }
                }
                if (!XML_Parse (parser, buf + i, 1, 0))
                {
                        Error = AnsiString(XML_ErrorString (XML_GetErrorCode (parser)));
                        error = true;
                        break;
                }
                if(endCompressTag)
                {
                    endCompressTag = false;
                    if(i + 1 < Len)
                    {
                        if(write(buf + i + 1, Len - (i + 2), Error) != 0)
                        {
                            error = true;
                            break;
                        }
                    }
                    break;
                }
        }
        return (!error);
}
  • C++ ビルダー 6
  • 外国人 2.0.1
4

1 に答える 1