【问题标题】:'\0' appears when parse xml with xerces使用 xerces 解析 xml 时出现“\0”
【发布时间】:2014-07-10 10:59:09
【问题描述】:

这是我的代码:

XercesDOMParser domParser;
MemBufInputSource* basic_mem = new MemBufInputSource(
    (const XMLByte* )(xmlString.c_str()),//xmlString is a std::string that contains xml
    xmlString.length(),//this std::string's length
    "dummy");
ParserErrorHandler parserErrorHandler;

domParser.setErrorHandler(&parserErrorHandler);
domParser.setExitOnFirstFatalError(true);
domParser.setValidationConstraintFatal(true);
domParser.setValidationScheme(XercesDOMParser::Val_Auto);
domParser.setDoNamespaces(true);    
domParser.setDoSchema(true);  
domParser.parse(*basic_mem);

我的xml字符串是这样的:

xmlString = "\
<root>\r\n\
<somenode someattr="abc@def"/>\r\n\
</root>"

然后我使用 xmlString.replace('@','\0') 添加 '\0' in。

问题来了:如果xmlString里面包含'\0',解析器会报错: “输入意外结束”。我认为这是因为'\ 0'。但我确信 xmlString 是完整的,并且 xmlString.length() 是正确的。 所以我试图将这个 '\0' 移动到 CDATA 中:

xmlString = "\
<root>\r\n\
<somenode>\r\n\
<![CDATA[abc\0def]]>\r\n\
</somenode>\r\n\
</root>"

然后解析器报告“CDATA意外结束”... 我能做些什么来解决这个问题?任何建议都会完成!

【问题讨论】:

标签: c++ xml xerces


【解决方案1】:

在 C/C++ 中,cstrings 由 \0 终止,因此您可以知道字符串在哪里结束,而无需将其长度作为单独的参数传递。一般来说,你不想把这个字符放在这个字符串的中间,因为你会丢失那个字符后面的所有东西。

【讨论】:

  • 谢谢,但是二进制文件可以传入std::string,一些std::string函数支持这个特性,比如append(string,length),或者replace(pos,length,string),我确信虽然里面有一个'\0',但字符串的长度是正确的,所以我认为这是在我调用 MemBufInputSource() 时或之后发生的问题,但我不确定这个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2013-07-22
  • 2011-05-31
  • 2011-02-09
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多