【问题标题】:XMLTextReader is created but XslCompiledTransform.Transform fails with invalid characterXMLTextReader 已创建,但 XslCompiledTransform.Transform 因字符无效而失败
【发布时间】:2015-04-01 15:57:58
【问题描述】:

我的代码:

using (XmlTextReader inputReader = new XmlTextReader(xml, XmlNodeType.Document, new XmlParserContext(null, null, "en", XmlSpace.Default)))
        {
            XsltArgumentList arglist = new XsltArgumentList();
            GetXSLT().Transform(inputReader, arglist, outputStream);
        }

XmlTextReader 创建良好,在 XML 内部有一个垂直选项卡的实体引用 ()

出错的那一行是对 Transform 的调用。它说有一个无效的 XML 字符(当然是垂直制表符)。

我已尝试使用以下文章中引用的方法:
Escape invalid XML characters in C#

我的问题是:如何使用 .NET 框架(如链接状态)删除或忽略无效字符?

注意:以不涉及对要替换的实体引用列表进行硬编码的方式(我已经在这样做了,这太可怕了,我感觉很糟糕,我应该这样做)

【问题讨论】:

  • 你可以试试ignoring it而不是删除。
  • 我试过了,但还是抛出了同样的异常
  • 阅读时忽略它们,写作时也应该忽略它们。
  • 你说得对,我刚刚明白了
  • 如果您可以发布一个使用var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray(); 删除字符的好方法,我将标记为答案

标签: c# xml


【解决方案1】:

尝试在读写时忽略无效的 XML 字符:

var readerSettings = new XmlReaderSettings() { CheckCharacters = false, ConformanceLevel = ConformanceLevel.Document };

using (var inputReader = XmlTextReader.Create(xml, readerSettings, new XmlParserContext(null, null, "en", XmlSpace.Default)))
{
    XsltArgumentList arglist = new XsltArgumentList();
    var xslt = GetXSLT();

    var writerSettings = xslt.OutputSettings.Clone();
    writerSettings.CheckCharacters = false;

    using (var outputWriter = XmlWriter.Create(outputStream, writerSettings))
    {
        xslt.Transform(inputReader, arglist, outputWriter);
    }
}

【讨论】:

  • 谢谢!我将不得不查看 ConformanceLevel = ConformanceLevel.Document 所做的事情,看看是否需要将其添加到我的。
  • @Nate 我的理解是,它与XmlTextReader 的构造函数的XmlNodeType.Document 参数相同。
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 2014-07-02
  • 2020-05-27
  • 1970-01-01
  • 2014-04-05
  • 2021-09-22
  • 2014-12-31
  • 2015-08-28
相关资源
最近更新 更多