2014-07-10 57 views
0

这里解析XML是我的代码:' 0' 出现时使用Xerces

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="[email protected]"/>\r\n\ 
</root>" 

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

这里是问题:如果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意外结束” ... 我能做些什么来解决这个问题?任何建议都会完成!

+0

XML中不允许使用'NUL'字符。请参见[XML规范](http://www.w3.org/TR/xml11/#charsets)。 – ach

回答

0

在C/C++中,cstrings被\0终止,所以你可以判断字符串的结束位置,而不会传递它作为单独参数的长度。一般来说,你不希望把这个角色放到这个字符串的中间,因为你会放弃那个角色后面的所有东西。

+0

谢谢,但是可以将二进制文件传递到std :: string,一些std :: string函数支持这个功能,比如append(string,length)或replace(pos,length,string),我相信虽然有一个'\ 0'里面,字符串的长度是正确的,所以我认为这是一个问题,当我调用MemBufInputSource()时或之后,但我不知道这个... – tobi