2013-02-19 98 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