Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免在XML文件保存期间转义特殊字符_Xml_Vb.net - Fatal编程技术网

避免在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文件后得到的是完全不同的 <Stream>XXXX-XXX

我正在使用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>
<和>在这里是专门用来显示的,而不是。我需要保留这种格式,但当我使用XmlDocument.Save方法时,它会替换所有的&by&;(此处留有空格以避免自动格式化我的文本…)

我使用此代码在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文档中写入数据而不使用符号转义?

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

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。需要将符号和写为&,但如果它是您想要的,您可以这样做。

如果写入字符串
会产生
”<;“


然后写入字符串
“因为要避免在将文本节点写入文档时提供的常规特殊字符转义,所以要确保调用来写出字符串

根据上述参考方法的备注:

此方法不会转义特殊字符

我特别声明了文本节点,因为这是很多人没有完全理解的;文本本身就是元素中的一个节点

发件人:(重点加上)

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 = "&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**)