避免在保存XML文件时转义特殊字符

时间:2018-08-20 15:26:11

标签: xml vb.net

我正在使用VB.NET编写一个程序,该程序必须将数据写入特定文件的XML标记中。

我愿意写的数据行如下。

<Stream>XXXX-XXXX-XXXX-XXXX?p=0</Stream><URL>rtmp://a.rtmp.youtube.com/live2</URL>

但是写完之后我在XML文件中得到的却完全不同。

<Stream>XXXX-XXXX-XXXX-XXXX?p=0</Stream><URL>rtmp://a.rtmp.youtube.com/live2</URL>

此处的&lt和&gt是出于目的,而不是<和>。我需要保持这种格式,但是当我使用XmlDocument.Save方法时,它将替换所有的&by&amp ;; (此处为避免自动格式化文本而使用空格...)

我使用此代码将数据写入xml文件。

Sub WriteXML()

   Document.Load("path to document")

   Dim Node As XmlNode = Document.SelectSingleNode("XPath to my data")
   If Node IsNot Nothing Then
      Node.InnerText = DATA
   End If

   Document.Save("path to document")

End Sub

我确实知道在这里可以正确编写书面XML文档的格式,但是我无法根据自己的意愿写数据...

如何在不对&符号进行转义的情况下将数据写入XML文档?

3 个答案:

答案 0 :(得分:0)

写入文件后,是否可以用字符串读取器将其打开并用&替换所有&实例?

Dim fileReader As String = My.Computer.FileSystem.ReadAllText("path to document).Replace("&lt;", "&").Replace("&amp;","&")
My.Computer.FileSystem.WriteAllText("new path", fileReader, False)

这样,您就可以保留XML代码并进行一些基本的清理。唯一的问题是,这不是有效的XML。 &号需要写为&,但是如果需要,可以执行此操作。

答案 1 :(得分:0)

由于要避免在将文本节点写入文档时提供正常的特殊字符转义,因此要确保调用XmlWriter.WriteRaw Method来写出字符串。 / p>

根据上面引用的方法的注释:

  

此方法不会转义特殊字符。

我特别指出了文本节点,因为这是许多人尚未完全理解的;文本本身就是元素中的节点。

发件人:XML DOM - The Element Object(添加了重点)

  

Element对象表示XML文档中的元素。元素   可能包含属性,其他元素或文本。如果一个元素   包含文本,该文本在文本节点中表示。

     

重要! 文本始终存储在文本节点中。 DOM中的常见错误   处理是导航到元素节点并期望它包含   文本。但是,即使是最简单的元素节点也具有文本节点   在它下面。例如,在2005年,有一个元素节点   (年),以及位于其下的文本节点,其中包含文本(2005)。

文本节点是XmlText Class的实例。所有XmlNode实例均支持XmlNode.WriteTo(XmlWriter) Method,该实例用于将节点的数据写入XmlWriter。如果我们查看this method(转换为VB),就会发现它调用的WriteString Method逃脱了特殊字符。

' Saves the node to the specified XmlWriter.
Public Overrides Sub WriteTo(ByVal w As XmlWriter)
    w.WriteString(Data)
End Sub

因此,如果我们创建派生自XmlText的类,则可以重写此方法以使用WriteRaw方法。

Public Class RawXMLText : Inherits XmlText
    Public Sub New(data As String, doc As XmlDocument)
        MyBase.New(data, doc)
    End Sub

    Public Overrides Sub WriteTo(w As XmlWriter)
        w.WriteRaw(Me.Data)
    End Sub
End Class

现在可以使用RawXMLText类创建一个节点,该节点将写入未转义的字符串(原始)。

Dim raw As String = "&lt;Stream&gt;XXXX-XXXX-XXXX-XXXX?p=0&lt;/Stream&gt;&lt;URL&gt;rtmp://a.rtmp.youtube.com/live2&lt;/URL&gt;"
Dim doc As New XmlDocument
doc.Load(**pathToDocument**)

' 1st get the containing element
Dim elementWithTextToChange As XmlNode = doc.SelectSingleNode("xpath to element")

' attempt to retrieve the child text node. will be null if there is no text
Dim possibleTextNode As XmlText = CType(elementWithTextToChange.SelectSingleNode("child::text()"), XmlText)

If possibleTextNode Is Nothing Then
    'create and add RawXMLText
    elementWithTextToChange.AppendChild(New RawXMLText(raw, doc))
Else
    ' replace existing XMLText with RawXMLText
    elementWithTextToChange.ReplaceChild(New RawXMLText(raw, doc), possibleTextNode)
End If
doc.Save(**pathToSaveTo**)

答案 2 :(得分:-1)

如果写入字符串"&lt;"会产生"&amp;lt;"

然后输入字符串"<"将产生"&lt;"

或者,退后一步,找到更好的设计...