3

我有一些解析 XML 字符串的 VB.Net 代码。

XML 字符串来自 TCP 3rd Party 流,因此我们必须获取我们获得的数据并处理它。我们遇到的问题是,其中一个元素数据有时可能包含特殊字符,例如 &、$、<,因此当执行“XMLDoc.LoadXml(XML)”时它会失败 - 注意 XMLDoc 配置为“Dim XMLDoc As XmlDocument =新的 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>
4

2 回答 2

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来自这里

更新

由于$在正则表达式中具有特殊含义,不能简单地添加到字典中;它需要\在正则表达式模式中进行转义。最简单的方法是手动编写模式,而不是将键加入字典:

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

另外,我强烈推荐Expresso使用正则表达式。

于 2013-02-19T20:27:10.477 回答
1

您的 XML 无效,因此它不是 XML。修复生成 XML 的代码(正确方法)或假装这是文本文件并享受解析非结构化文本的所有问题。

正如您在问题中所述,<Message>O&N</Message>XML 无效。这种“XML”最可能的原因是使用字符串连接来构造它,而不是使用适当的 XML 操作方法。除非您使用某种晦涩难懂的语言,否则所有实际使用的语言都已内置或库支持 XML 创建,因此正确创建 XML 应该不难。

于 2013-02-19T18:14:37.877 回答