2013-02-19 139 views
3

我有一些解析XML字符串的VB.Net代碼。在VB.Net中解析XML由於特殊字符而失敗

XML字符串來自TCP第三方流,因此我們必須獲取我們得到的數據並處理它。 我們遇到的問題是其中一個元素數據有時可能包含特殊字符,例如&,$,<,因此當執行「XMLDoc.LoadXml(XML)」時失敗 - 注意XMLDoc被配置爲「Dim XMLDoc As XmlDocument = New XmlDocument()」。

已經嘗試谷歌的答案,但我真的很努力尋找解決方案。曾看過RegEX但意識到這有一些限制;或者我只是不明白它足夠大聲笑。

如果它有幫助,這裏是一個XLM的例子,我們將流式傳輸給我們(僅供參考消息標籤來自SMS消息): - (如果它有助於唯一會有錯誤的位是(和所有我要檢查)的<Message>O&N</Message>部分,因此在這種情況下,消息已經在與&)

<IncomingMessage><DeviceSendTime>19/02/2013 14:00:50</DeviceSendTime> 
<Sender>0000111111</Sender> 
<Status>New</Status> 
<Transport>Sms</Transport> 
<Id>-1</Id> 
<Message>O&N</Message> 
<Timestamp>19/02/2013 14:00:50</Timestamp> 
<ReadTimestamp>19/02/2013 14:00:50</ReadTimestamp> 
</IncomingMessage> 
+0

這只是不好的數據。除了在源頭修復它之外,你無能爲力。如果你很瞭解XML標準,那麼可以編寫一些正則表達式來處理它,但這只是一個解決更大問題的方式。 – Romoku 2013-02-19 17:53:52

+0

我同意@Romoku通過Regex清理XML只是一個繃帶。 – malkassem 2013-02-19 17:56:45

+1

'&'和'$'可能被簡單地「清理」,但是'<'將會很困難。你能否提供一些例子,其中的尖括號出現在你的流中?另外,你還看到了哪些其他「錯誤」字符? – 2013-02-19 18:00:11

回答

3

如果我們中Message元素專門尋找,並假設有在Message元素中沒有嵌套元素:

Dim url = "put url here" 
Dim s As String 

Dim characterMappings = New Dictionary(Of String, String) From { 
    {"&", "&amp;"}, 
    {"<", "&lt;"}, 
    {">", "&gt;"}, 
    {"""", "&quot;"} 
} 

Using client As New WebClient 
    s = client.DownloadString(url) 
End Using 
s = Regex.Replace(s, 
    "(?:<Message>).*?(" & String.Join("|", characterMappings.Keys) & ").*?(?:</Message>)", 
    Function(match) characterMappings(match.Groups(1).Value) 
) 
Dim x = XDocument.Parse(s) 

$不宜與XML的問題,但如果它是你可以添加它的字典。

使用WebClient來自here

更新

由於$在正則表達式的特殊含義,它不能簡單地添加到字典;它需要以正則表達式模式中的\進行轉義。要做到這一點最簡單的方法,是手工編寫的,而不是加盟的鑰匙字典模式,:

s = Regex.Replace(s, 
    "(?:<Message>).*?(&|<|>|\$).*?(?:</Message>)", 
    Function(match) characterMappings(match.Groups(1).Value) 
) 

另外,我強烈建議Expresso的使用正則表達式。

+0

嗨Zev,非常感謝您的迴應(和其他人都讚賞)我有一件好事是我只需要檢查''標籤,其他標籤都將100%罰款。我已經勾選了你的答案,因爲我把它看作是一個可能的答案,但只是不確定RegEx表達式的確切語法,所以非常感謝。我將在今天晚些時候/明天晚些時候發佈此消息,並將在此發佈我的反饋意見。再次感謝大家的快速響應。乾杯,史蒂夫(只是爲了信息只有幾個字符,我們有問題,所以只是$添加真的) – user2088072 2013-02-20 10:10:33

+0

@ user2088072你確定'$'導致問題?它不是一個特殊的XML字符,因此不應該阻止解析爲XML,即使它在數據中。 – 2013-02-21 07:15:43

1

你的XML是無效的,因此它不是XML。要麼修復生成XML的代碼(正確的方法),要麼假裝這是文本文件,並享受解析非結構化文本的所有問題。

正如您在問題<Message>O&N</Message>中所述是無效的XML。這種「XML」的最可能原因是使用字符串連接來構造它,而不是使用正確的XML操作方法。除非您使用某些arcane language,否則所有實際使用的語言都已內置或支持XML創建,因此不應該很難創建XML。

+2

這不是*他* XML。那就是問題所在。 – 2013-02-19 18:27:59

+1

@TimPietzcker,它*不是XML *,所以試圖用XML解析器解析它是在尋求麻煩。對固定字符串進行自定義匹配以獲取範圍而不是試圖將其放入XML中會更容易。 – 2013-02-19 18:31:53