2014-07-10 62 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