我正在维护一个旧的.Net 2.0服务,该服务从数据库读取数据,并将其序列化为XML文件,以便转换/输出为字母。
它一直运行良好多年,但会间歇性地吐出格式错误的文件,其中某些字符(>和\ b和\)将被转换而不是作为文字文本对应物。
我认为这可能与编码有关,但我无法理解为什么它会间歇性地进行。请参阅下面的一些文件之间的示例(我已经更改了一些名称):
精细:
<?xml version="1.0"?>
<?encoding iso-8859-1?>
<?xml-stylesheet type='text/xsl' href='\\SERVER\FOLDER\bin\stylesheet\blabla.xsl'?>
格式错误:
<?xml version="1.0" standalone="yes"?><?encoding iso-8859-1?><?xml-stylesheet type='text/xsl' href='\SERVER\FOLDERin\stylesheet\blabla.xsl'?>
(我确实注意到后者由于某种原因而独立=“是”..这会影响吗?这两个文件都是从相同的代码生成的。)
精细:
<LetterText><FONT size=2 face=Arial>
<P style="MARGIN-RIGHT: 0px" dir=ltr align=left><FONT size=2 face=Arial>Dear Sir/Madam </P>
<P style="MARGIN-RIGHT: 0px" dir=ltr align=left><FONT size=2 face=Arial><STRONG><U>ZERO FARE PASS</U></STRONG></FONT></P>
格式错误:
<LetterText><FONT size=2 face=Arial>
<P style="MARGIN-RIGHT: 0px" dir=ltr align=left><FONT size=2 face=Arial>Dear Sir/Madam </P>
<P style="MARGIN-RIGHT: 0px" dir=ltr align=left><FONT size=2 face=Arial><STRONG><U>BLABLABLA BLABLA</U></STRONG></FONT></P>
以下是我认为处理此问题的代码(我再次改变了一些名称,例如MyObject等):
' create a serializer to create the xml output.
mySerializer = New XmlSerializer(GetType(myObject))
' serialize the pass batch to a stream in memory - allows us to edit the stream before outputting to a file
xmlMemoryStream = New MemoryStream()
mySerializer.Serialize(xmlMemoryStream, passes)
' load the xml from the memory stream into an XML Document
xmlMemoryStream.Seek(0, SeekOrigin.Begin)
xmlDocument.Load(xmlMemoryStream)
' set the stylesheet instruction up and add it to the xml document. if
' the stylesheet is set on the print queue then use it
Dim processingInstruction As XmlProcessingInstruction
processingInstructionText = String.Format("type='text/xsl' href='{0}'", oPrintQueueType.stylesheet)
processingInstruction = xmlDocument.CreateProcessingInstruction("xml-stylesheet", processingInstructionText)
xmlDocument.InsertAfter(processingInstruction, xmlDocument.FirstChild)
' we must inform xml parses about special encoding we need to use to display
' unicode charaters in the xml with iso-8859-1 encoding
Dim instruction As XmlProcessingInstruction = xmlDocument.CreateProcessingInstruction("encoding", "iso-8859-1")
xmlDocument.InsertAfter(instruction, xmlDocument.FirstChild)
xmlDocument.PreserveWhitespace = True
' make a new file stream to the desired output file and use it to save the XML Document
' we must write unicode due to the characters in the encoded number string
stream = New System.IO.FileStream(filename, FileMode.Create)
xmlTextWriter = New XmlTextWriter(stream, System.Text.Encoding.Unicode)
xmlDocument.WriteTo(xmlTextWriter)
xmlTextWriter.Flush()
xmlTextWriter.Close()
我想知道是否要将iso-8859-1编码更改为UTF-8。无论哪种方式,我不理解的是为什么它是间歇性地不同,使用相同的代码,相同的数据,但有时只转换某些特殊字符。
我知道排除这些的很多方法(例如C#中的@符号),但大多数都需要访问原始数据和单个元素。这个应用程序只是选择并处理它。
其他任何有此经验的人或者可以给我一个关注焦点的指针吗?
答案 0 :(得分:1)
固定。
改变了这一行:
Dim instruction As XmlProcessingInstruction = xmlDocument.CreateProcessingInstruction("encoding", "iso-8859-1")
要:
Dim instruction As XmlProcessingInstruction = xmlDocument.CreateProcessingInstruction("encoding", "UTF-8")
之前没有看到过腐败的XML问题。可能是巧合,因为它之前是间歇性的(已经工作了10年以上),但看起来至少是固定的。