我正在使用VB.NET编写一个程序,该程序必须将数据写入特定文件的XML标记中。
我愿意写的数据行如下。
<Stream>XXXX-XXXX-XXXX-XXXX?p=0</Stream><URL>rtmp://a.rtmp.youtube.com/live2</URL>
但是写完之后我在XML文件中得到的却完全不同。
&lt;Stream&gt;XXXX-XXXX-XXXX-XXXX?p=0&lt;/Stream&gt;&lt;URL&gt;rtmp://a.rtmp.youtube.com/live2&lt;/URL&gt;
此处的&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文档?
答案 0 :(得分:0)
写入文件后,是否可以用字符串读取器将其打开并用&替换所有&实例?
Dim fileReader As String = My.Computer.FileSystem.ReadAllText("path to document).Replace("<", "&").Replace("&","&")
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 = "<Stream>XXXX-XXXX-XXXX-XXXX?p=0</Stream><URL>rtmp://a.rtmp.youtube.com/live2</URL>"
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;"
然后输入字符串"<"
将产生"<"
。
或者,退后一步,找到更好的设计...