2

我正在使用 XML 在应用程序之间发送项目信息。其中一条信息是项目描述。所以我有:

<ProjectDescription>Test &amp; spaces around&amp;some  &amp;  amps!</ProjectDescription>

或者:“测试和空间&一些&s!” <--很好!

然后当我使用 Expat 解析它时,我的数据处理程序一次只获取整个字符串的一部分。“测试”,然后是“&”,然后是“周围的空格”,下一个“&”等等。当我尝试重建原始字符串时,& 周围的所有间距都被删除,因为数据处理程序永远不会到达看他们。然后,当我重新编写 XML 时,我得到:

<ProjectDescription>Test&amp;spaces around&amp;some&amp;amps!</ProjectDescription>

或者:“测试&空间&一些&s!” <--糟糕!

这是现有解决方法的已知问题吗?我可以给 Expat 一些设置来控制其围绕转义符号的行为吗?

我在谷歌上搜索答案的尝试遭遇了惨淡的失败。

编辑:回答评论中的问题:我有自己的处理程序,我在解析器中注册:

parser=XML_ParserCreate(NULL); 
XML_SetUserData(parser,&depth);
XML_SetElementHandler(parser,startElement,endElement); 
XML_SetCharacterDataHandler(parser,dataHandler); 

处理程序声明如下:

static void dataHandler(void *userData,const XML_Char *s,int l) 

然后“s”包含元素中的数据。没有任何 & 的东西,它是打开和关闭标签之间的整个字符串,在“带空格的字符串”的情况下。

4

1 回答 1

0

我刚刚使用我自己的使用 expat 的库进行了测试。我的处理程序看起来像这样,带有调试语句来显示正在发生的事情:

void CharDataHandler( void * parser, 
                       const XML_Char *s,
                       int len ) {
    std::cerr << "[" << s << "]\n";
    std::cerr << len << "\n";
    // my own processing here - not important 
}

我看不到你所说的行为。对于输入数据:

XXX &amp; YYY

我得到三个事件,其中 char * 和长度数据集如下:

char * = "XXX &amp; YYY"
length = 4

char * = "&"
length = 1

char * = " YYY"
length = 4

所以空间被保留了。据我所知,我没有使用任何特殊设置。您使用的是什么版本和平台的 Expat?

于 2009-12-14T11:17:25.070 回答