避免在XML文件保存期间转义特殊字符
我正在使用VB.NET制作一个程序,该程序必须将数据写入特定文件的XML标记中 我愿意写的数据行如下避免在XML文件保存期间转义特殊字符,xml,vb.net,Xml,Vb.net,我正在使用VB.NET制作一个程序,该程序必须将数据写入特定文件的XML标记中 我愿意写的数据行如下 <Stream>XXXX-XXXX-XXXX-XXXX?p=0</Stream><URL>rtmp://a.rtmp.youtube.com/live2</URL> 但我在编写XML文件后得到的是完全不同的 &lt;Stream&gt;XXXX-XXX
<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;
<和>在这里是专门用来显示的,而不是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文档中写入数据而不使用符号转义?在写入文件后,您是否可以使用字符串读取器将其打开并用符号替换所有实例
Dim fileReader As String = My.Computer.FileSystem.ReadAllText("path to document).Replace("<", "&").Replace("&","&")
My.Computer.FileSystem.WriteAllText("new path", fileReader, False)
这样,您就可以保留XML代码,只需进行一些基本的清理。唯一的问题是,这不是有效的XML。需要将符号和写为&,但如果它是您想要的,您可以这样做。如果写入字符串
“
会产生”<;“
然后写入字符串
“因为要避免在将文本节点写入文档时提供的常规特殊字符转义,所以要确保调用来写出字符串
根据上述参考方法的备注:
此方法不会转义特殊字符
我特别声明了文本节点,因为这是很多人没有完全理解的;文本本身就是元素中的一个节点
发件人:(重点加上)
Element对象表示XML文档中的一个元素
可能包含属性、其他元素或文本。如果
包含文本,文本在文本节点中表示
重要提示!文本始终存储在文本节点中。DOM中的一个常见错误
处理是导航到元素节点并期望它包含
文本。但是,即使是最简单的元素节点也有文本节点
例如,在2005年,有一个元素节点
(年)及其下的文本节点,其中包含文本(2005)
文本节点是的实例。所有XmlNode实例都支持将节点的数据写入XmlWriter
。如果查看(转换为VB),我们会看到它调用转义特殊字符的
' 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
类创建一个节点,该节点将写入未转义字符串(raw)
你是控制两端,还是试图为一个你不控制的读卡器写东西?如果你控制两端,你考虑过使用CDATA作为有效载荷吗?在这种情况下,我写的是一个保存文件,它将由一个我没有制作的程序读取…但正如最后一个答案所说,我需要退后一步,想一想…如果我的数据包含and和字符,然后将其格式化为and和,…这将是XML文档中我的数据的正确格式。谢谢,这正是我在睡了一个好觉后所想的!你是对的,只是稍微休息一下,然后再做回去,总是一个很好的方式来意识到这并不难…如果这是正确答案,请单击问题旁边的勾选标记将其标记为已接受。
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**)