c# - .Net Core XSLT 转换引发异常“无效的 XML 字符”。但在 .Net Framework 上工作正常
问题描述
我正在尝试使用XsltCompiledTransform
. 在我的本地 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 操作系统上总是可以正常运行。
我试图在设置中禁用字符检查,但无论如何都不起作用。
如果我在 Windows 或 Linux 操作系统的本地 PC 上运行代码,一切正常。同样在 .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
Net Core - 2.2
Docker 容器 - Linux
有谁知道如何解决这个问题?
解决方案
为了修复错误,我将带有 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);
}
推荐阅读
- postgresql - 尝试在 azure 云提供商上创建私有链接时出现问题
- python - 如何从 cython 访问 python 共享内存?
- c++ - 如何在初始化时设置结构的向量成员的大小?
- excel - VBA 编辑注册表受信任位置*有时*有效
- mysql - 使用窗口函数根据另一列从列中检索值
- reactjs - ./src/components/CustomNavbar.jsx 未找到模块:无法解析“/Users/Documents/GitHub/myweb_app/src/components”中的“react-router-dom”
- amazon-web-services - 使用低基数的排序键有什么缺点吗?
- python - 如何验证 Pika 是否异步工作?
- ninject - Autofac 等效于 NInject 的 ToMethod() 与开放泛型
- python - 雅虎社交登录不起作用 django-allauth