.Net Core XSLT 转换引发异常“无效的 XML 字符”。但在 .Net Framework 上工作正常

Posted

技术标签:

【中文标题】.Net Core XSLT 转换引发异常“无效的 XML 字符”。但在 .Net Framework 上工作正常【英文标题】:.Net Core XSLT transform throws exception "Invalid XML character". But on .Net Framework works fine 【发布时间】:2020-02-13 12:34:49 【问题描述】:

我正在尝试使用 XsltCompiledTransform 转换 XML。在我的本地 PC 上,它工作正常。但在 docker 容器中,有时XsltCompiledTransform.Transform() 会抛出。

完全错误

System.ArgumentException: '.', hexadecimal value 0x00, is an invalid character.
   at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlEncodedRawTextWriter.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at System.Xml.Xsl.Runtime.XmlRawWriterWrapper.WriteString(String text)
   at System.Xml.Xsl.Runtime.XmlQueryOutput.StartCopy(XPathNavigator navigator, Boolean callChk)
   at System.Xml.Xsl.Runtime.XmlQueryOutput.CopyNode(XPathNavigator navigator)
   at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteItem(XPathItem item)
   at <xsl:template name="compiler:generated"> (2)(XmlQueryRuntime , XPathNavigator , String , String , String , IList`1 , String )
   at <xsl:template name="compiler:generated">(XmlQueryRuntime , XPathNavigator )
   at <xsl:template match="/">(XmlQueryRuntime , XPathNavigator )
   at Root(XmlQueryRuntime )
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
   at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XmlWriter results)
   at XsltTranslator.Translate(Byte[] report)

XSLT 文件有效。 XML 是有效的。我敢肯定,因为这段代码有时可以在 docker 中运行,并且在具有相同文件的 Windows 或 Linux 操作系统上总是可以正常运行。

我尝试在设置中禁用字符检查,但无论如何都不起作用。

如果我在本地 PC 上的 Windows 或 Linux 操作系统上运行代码,一切正常。同样在 .Net Framework 上一切正常。

我的代码:

public byte[] Translate(byte[] report)

    byte[] result;

    var encoding = Encoding.GetEncoding(1251);
    var xsltTransform = new XslCompiledTransform();

    var version = GetVersion(report, encoding);
    using (var xmlReader = XmlReader.Create(new StringReader(encoding.GetString(report))))
    using (var writerStream = new MemoryStream())
    using (var writer = XmlWriter.Create(writerStream, new XmlWriterSettings  Encoding = encoding ))
    
        xsltTransform.Load(Path.Combine(shemesPath, $"version.xslt"));
        xsltTransform.Transform(xmlReader, writer);
        result = writerStream.ToArray();
    

    return result;

Docker - 18.09.9 网络核心 - 2.2 Docker 容器 - Linux

有人知道如何解决这个问题吗?

【问题讨论】:

0x00 确实是一个无效的 XML 字符。请检查encoding.GetString(report) 返回的内容。 我查了一下,encoding.GetString(report) 总是返回正确的xml。 我也尝试使用 XmlConvert.IsXmlChar() 进行检查 那么你从哪里得到错误?在Transform 电话上?那是“有时”它以与特定 XML 输入和/或特定 XSLT 代码相关的任何方式引发异常吗?或者即使是同一组 XML 和 XSLT 有时在 docker 容器中也能正常工作,有时不能? Transform 通话中。同一套 XML 和 XSLT 【参考方案1】:

为了修复错误,我将一个带有 xml 的文件写入磁盘,然后通过 XslCompiledTransform.Load() 进行加载


public byte[] Translate(byte[] report)

     var tempFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
     Directory.CreateDirectory(tempFolder);
     var reportPath = Path.Combine(tempFolder, "report.xml");
     var resultPath = Path.Combine(tempFolder, "result.xml");

     File.WriteAllBytes(reportPath, report);
     var encoding = Encoding.GetEncoding(1251);

     var version = GetVersion(report, encoding);
     var xsltTransform = new XslCompiledTransform(true);
     xsltTransform.Load(Path.Combine(shemesPath, $"version.xslt"));
     xsltTransform.Transform(reportPath, resultPath);

     return File.ReadAllBytes(resultPath);

【讨论】:

以上是关于.Net Core XSLT 转换引发异常“无效的 XML 字符”。但在 .Net Framework 上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2 中的依赖注入引发异常

由ASP.NET Core根据路径下载文件异常引发的探究

带有 .Net Core 的 AWS Secret Manager 引发套接字异常

由ASP.NET Core根据路径下载文件异常引发的探究

ASP.NET Odata Web API 的错误处理

LINQ 实体框架查询在 EF Core 中不起作用,引发异常