VB.NET中的拆分字符串会产生异常结果

时间:2014-07-05 10:00:17

标签: vb.net

我在VB.NET中使用Split函数,当我显示输出时它产生一个奇怪的结果。

我有一个XML文档,我只想循环遍历文档中的每个<backup>标记,因此我正在使用:

Dim XMLString As String
XMLString = "<backup>INFO</backup><backup>ANOTHER INFO</backup>"

Dim SplitBackup As String()
SplitBackup = XMLString.Split("<backup>")

For Each BackupContent In SplitBackup
    MsgBox(BackupContent)
Next

现在,人们会期望这会在MsgBox中输出INFO,我点击确定,然后另一个会弹出并显示'另一个信息',但似乎Split功能被填满了'&lt;'和'&gt;'在里面。有道路我可以通过逃避它或以其他方式解析它来解决这个问题。

非常感谢任何建议!

3 个答案:

答案 0 :(得分:1)

给XML一个机会。

    Dim bups As XElement = <backups><backup>INFO</backup><backup>ANOTHER INFO</backup></backups>
    For Each xe As XElement In bups.Elements
        Debug.WriteLine(xe.Value)
    Next

答案 1 :(得分:0)

你需要摆脱关闭元素。

所以你可以使用:

Dim XMLString As String
XMLString = "<backup>INFO</backup><backup>ANOTHER INFO</backup>"

Dim SplitBackup As String()
SplitBackup = XMLString.Split("<backup>")

For Each BackupContent In SplitBackup
    Dim Something() as string
    Something = BackupContent.Split("</backup">)
    MsgBox(Something(0))
Next

虽然不是最优雅的编码。

答案 2 :(得分:0)

执行此操作的一种可能性是使用regular expression拆分标记(并转义有问题的符号),然后使用LINQ to Objects从每个标记中获取值:

Dim XMLString As String = "<backup>INFO</backup><backup>ANOTHER INFO</backup>"
Dim words = Regex.Split(XmlString, "\<backup\>").Where(function(f) not String.IsNullOrEmpty(f)).Select(function(f) f.Replace("</backup>", String.Empty))    ' 
for each word in words
    Console.WriteLine(word)
next word

输出结果为:

INFO
ANOTHER INFO

代码的作用:

Dim words = Regex
                ' split on every tag
                .Split(XmlString, "\<backup\>")
                ' remove empty items
                .Where(function(f) not String.IsNullOrEmpty(f))
                ' remove trailing closing tag and thus retrieve the value within
                .Select(function(f) f.Replace("</backup>", String.Empty))

正如已经建议的那样,您最好学习如何使用内置XML支持 - 它更容易,更安全,因为您无需关注括号 - <>会自动处理。可能的解决方案可能如下所示(!您需要有一个有效的XML结构 - 一个唯一的根节点!):

' !!! you need to have a valid XML element - one root node !!!
Dim XMLString As String = "<root><backup>INFO</backup><backup>ANOTHER INFO</backup></root>"
dim words = XDocument.Parse(XMLString).Root.Descendants("backup").Select(function (f) f.Value)

for each word in words
    Console.WriteLine(word)
next word

输出与上述相同。代码如何工作:

dim words = XDocument
                ' parse the specified XML structure; use Load("file.xml") to load from file
                .Parse(XMLString)
                ' from the root node
                .Root
                ' take all nodes matching the specified tag
                ' note - no need to pay attention to the < and >
                .Descendants("backup")
                ' select the value of the XML node
                .Select(function (f) f.Value)