2017-05-26 36 views
-1

我試圖解析其中包含西裏爾字母XML文件,我收到解析錯誤:Rapidxml從COM對象中讀取西里爾

這裏「數據的意外的結束」是,我用它來解析代碼,以及趕上我在進入聲明

rapidxml::xml_document<TCHAR> doc; 
rapidxml::xml_node<TCHAR>* rootNode; 

// Helping in the debug 
// std::cout << nElementIndex << std::endl; 

const int SIZE = 300; 
LPWSTR indirectString = new wchar_t[SIZE]; 

TCHAR* temp = m_vecContainer[nElementIndex].xml.GetBuffer(); 

try 
{ 
    doc.parse<0>(&temp[0]); 
} 
catch (rapidxml::parse_error &e) 
{ 
    return ERROR_INVALID_FUNCTION; 
} 

這裏是可以返回xml.GetBuffer()方法的一個例子:

<?xml version="1.0" encoding="UTF-16"?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
    <Version>1.3.33.5</Version> 
    <Description>Поддържа актуален софтуера ви от Google. Ако тази задача е деактивирана или спряна, софтуерът ви от Google няма да е актуален, което означава, че ако в сигурността възникне уязвимост, тя няма да бъде коригирана и е възможно някои функции да не работят. Тази задача се деинсталира сама, когато няма софтуер от Google, който да я използва.</Description> 
    <URI>\GoogleUpdateTaskMachineCore</URI> 
    </RegistrationInfo> 
... 
</Task> 

有人可以幫助我,因爲我無法找到的任何有用的信息 互聯網。

在此先感謝。

+0

你用TCHAR = char或wchar_t來編譯嗎? RapidXML在UTF-8上正常工作,但你的傳球廣泛。如果它們是UTF-16,那麼它可能會起作用,但如果它們是別的東西,所有的投注都關閉。 (並且XML中的編碼屬性不相關!) – Roddy

回答

0

我對rapidxml並不熟悉,但快速搜索顯示它默認處理utf8輸入。所以,你的問題可能不是西裏爾字母。我會專注於「意外的數據結束」通知,並確認XML Feed遵循嚴格的XML規則。試試這些工具:

http://www.xmlvalidation.com/
http://www.utilities-online.info/xsdvalidation/#.WSgPG2iGOUk

如果你的XML是有效的,我很抱歉,我沒有其他線索來幫助你。

祝你好運!

+0

感謝您的快速評論,我在編寫此問題之前嘗試了兩種工具,並且這兩種工具都驗證了XML文件。我也閱讀了他們的在線手冊,發現rapidxml應該能夠使用UTF-8和wchar_t以及TCHAR字符串。 另外我試圖將XML文件中的西里爾語文本更改爲拉丁文,並且一切正常......這就是爲什麼我猜西里爾文是問題所在。 – Mario

+0

@Mario啊,那麼我會同意你的意見,即XML的內容。但是,在我們直接指責西里爾語之前,您是否可以嘗試用拉丁文替換所有西裏爾字母,並在文本中只混合一個西里爾文字符?如果沒有失敗,你就會遇到一些棘手的問題。 –

+0

嗯,很奇怪,你說得對。我混合西里爾文和拉丁文,如果我添加一個字或一個字母,分析器的工作原理。但是,如果我添加幾個句子,它不起作用。 – Mario