带有分音符(ä)的拉丁小写字母a在xml中无效

时间:2014-12-01 12:45:56

标签: xml vb.net xslt

我认为这只是一个全球化问题,或者我应该用正确的编码中的分音符替换这个小字母a,但是现在我不确定如何。

我最近开始学习VB.NET,似乎不支持字符串转义。作为针对实时数据的一点实践应用,我写了以下内容:

Sub Main()
    Console.WriteLine(GetXml().Substring(800, 50))
    Transform()
End Sub

Sub Transform()
    Dim xml = GetXml()
    Dim xsl = GetXsl()
    Dim writer As New StringWriter()
    Dim xPath = New XPathDocument(GetReader(xml))
    Dim xslTransform = New XslCompiledTransform()
    xslTransform.Load(GetReader(xsl))
    xslTransform.Transform(xPath, Nothing, writer)

    Console.Write(writer.ToString())
End Sub

Public Function GetReader(input As String) As XmlReader
    Dim memStream = New MemoryStream()
    Dim data = Encoding.Default.GetBytes(input)
    memStream.Write(data, 0, data.Length)
    memStream.Position = 0
    Return XmlReader.Create(memStream)
End Function

GetXmlGetXsl字面上返回一个硬编码的xml字符串和一个硬编码的xsl字符串。问题是数据是从我们的一个实时系统中获得的,并且是德语。我将在未来获得类似的数据。这意味着我在标题中遇到了字符,并且在运行时也出现了以下错误:

Unhandled Exception: System.Xml.XmlException: Invalid character in the given enc
oding. Line 1, position 804.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32&
 charsCount)
   at System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
   at System.Xml.XmlTextReaderImpl.ReadData()
   at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32&
outStartPos, Int32& outEndPos)
   at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace s
pace)
   at System.Xml.XPath.XPathDocument..ctor(XmlReader reader, XmlSpace space)
   at System.Xml.XPath.XPathDocument..ctor(XmlReader reader)
   at VBXSLTtoXML.Module1.Transform() in c:\users\eon\documents\visual studio 20
13\Projects\VBXSLTtoXML\VBXSLTtoXML\Module1.vb:line 18
   at VBXSLTtoXML.Module1.Main() in c:\users\eon\documents\visual studio 2013\Pr
ojects\VBXSLTtoXML\VBXSLTtoXML\Module1.vb:line 11

目前,我该怎么做才能解决错误并允许New XPathDocument(GetReader(xml))通过?我应该修改检索到的XML以替换不受支持的字符吗?

1 个答案:

答案 0 :(得分:1)

使用字符编码时,明确告诉解析器使用哪种编码总是一个好主意。

您会相信,由于XML声明<?xml version=""1.0"" encoding=""utf-8""?>,编码器会自动选择UTF-8,但遗憾的是情况并非如此。

正如您在上面对自己的回复中所述,请使用GetReader函数 - Encoding.UTF8.GetBytes()