如何防止 System.Xml.XmlException:给定编码中的字符无效

2024-01-01

我有一个用 C# 编写的 Windows 桌面应用程序,它循环访问存储在磁盘上并由第 3 方程序创建的一堆 XML 文件。大多数文件都由以下语句后面的 LINQ 代码成功加载和处理:

XDocument xmlDoc = XDocument.Load(inFileName);
List<DocMetaData> docList =
      (from d in xmlDoc.Descendants("DOCUMENT")
       select new DocMetaData
       {
      File = d.Element("FILE").SafeGetAttributeValue("filename")
         ,
      Folder = d.Element("FOLDER").SafeGetAttributeValue("name")
         ,
      ItemID = d.Elements("INDEX")
          .Where(i => (string)i.Attribute("name") == "Item ID(idmId)")
          .Select(i => (string)i.Attribute("value"))
          .FirstOrDefault()
         ,
      Comment = d.Elements("INDEX")
          .Where(i => (string)i.Attribute("name") == "Comment(idmComment)")
          .Select(i => (string)i.Attribute("value"))
          .FirstOrDefault()
         ,
      Title = d.Elements("INDEX")
          .Where(i => (string)i.Attribute("name") == "Title(idmName)")
          .Select(i => (string)i.Attribute("value"))
          .FirstOrDefault()
         ,
      DocClass = d.Elements("INDEX")
          .Where(i => (string)i.Attribute("name") == "Document Class(idmDocType)")
          .Select(i => (string)i.Attribute("value"))
          .FirstOrDefault()
       }
      ).ToList<DocMetaData>();

...其中 inFileName 是完整路径和文件名,例如:

     Y:\S2Out\B0000004\Pet Tab\convert.B0000004.Pet Tab.xml

但其中一些文件会导致如下问题:

System.Xml.XmlException: Invalid character in the given encoding. Line 52327, position 126.
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.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)
at System.Xml.XmlTextReaderImpl.ParseAttributes()
at System.Xml.XmlTextReaderImpl.ParseElement()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
at System.Xml.Linq.XDocument.Load(String uri, LoadOptions options)
at System.Xml.Linq.XDocument.Load(String uri)
at CBMI.WinFormsUI.GridForm.processFile(StreamWriter oWriter, String inFileName, Int32 XMLfileNumber) in C:\ProjectsVS2010\CBMI.LatitudePostConverter\CBMI.LatitudePostConverter\CBMI.WinFormsUI\GridForm.cs:line 147
at CBMI.WinFormsUI.GridForm.btnProcess_Click(Object sender, EventArgs e) in C:\ProjectsVS2010\CBMI.LatitudePostConverter\CBMI.LatitudePostConverter\CBMI.WinFormsUI\GridForm.cs:line 105

XML 文件如下所示(此示例仅显示 2 个 DOCUMENT 元素,但实际上有很多元素):

<?xml version="1.0" ?>
<DOCUMENTCOLLECTION>
   <DOCUMENT>
       <FILE filename="e:\S2Out\B0000005\General\D003712420.0001.pdf" outputpath="e:\S2Out\B0000005\General"/>
       <ANNOTATION filename=""/>
       <INDEX name="Comment(idmComment)" value=""/>
       <INDEX name="Document Class(idmDocType)" value="General"/>
       <INDEX name="Item ID(idmId)" value="003712420"/>
       <INDEX name="Original File Name(idmDocOriginalFile)" value="Matrix Aligning 603.24 Criteria to Petition Pages.pdf"/>
       <INDEX name="Title(idmName)" value="Matrix for 603.24"/>
       <FOLDER name="/Accreditation/PASBVE/2004-06"/>
   </DOCUMENT>
   <DOCUMENT>
       <FILE filename="e:\S2Out\B0000005\General\D003712442.0001.pdf" outputpath="e:\S2Out\B0000005\General"/>
       <ANNOTATION filename=""/>
       <INDEX name="Comment(idmComment)" value=""/>
       <INDEX name="Document Class(idmDocType)" value="General"/>
       <INDEX name="Item ID(idmId)" value="003712442"/>
       <INDEX name="Original File Name(idmDocOriginalFile)" value="Contacts at NDU.pdf"/>
       <INDEX name="Title(idmName)" value="Contacts at NDU"/>
       <FOLDER name="/Accreditation/NDU/2006-12/Self-Study"/>
   </DOCUMENT>

LINQ 语句有其自身的复杂性,但我认为它工作正常;这是 LOAD 失败的原因。我查看了 XDocument Load 的各种构造函数,并且研究了引发此异常的其他一些问题,但我对如何防止这种情况感到困惑。

最后,在无法加载的文件中的第 52327 行位置 126,看来第 52327 行上的数据不应导致问题(最后一个字符位于位置 103!

<FILE filename="e:\S2Out\B0000004\Pet Tab\D003710954.0001.pdf" outputpath="e:\S2Out\B0000004\Pet Tab"/>

为了控制编码(一旦您知道它是什么),您可以使用以下命令加载文件Load方法重写接受Stream.

然后你可以创建一个新的StreamReader针对您的文件指定适当的Encoding在构造函数中。

例如,要使用西欧编码打开文件,请替换问题中的以下代码行:

XDocument xmlDoc = XDocument.Load(inFileName);

用这个代码:

XDocument xmlDoc = null;

using (StreamReader oReader = new StreamReader(inFileName, Encoding.GetEncoding("ISO-8859-1"))) {
    xmlDoc = XDocument.Load(oReader);
}

支持的编码列表可以在MSDN 文档 http://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 System.Xml.XmlException:给定编码中的字符无效 的相关文章

随机推荐

  • 基于分布式 JMS 的日志记录.. 表现平平?

    在我们精美的 ESB 中 每个请求的日志记录都是通过基于 JMS 日志记录的通用基础设施完成的 简而言之 发生的事情如下 服务获取请求服务 在 LogData 中准备一些数据 对象服务调用数据库 LogData 对象中捕获数据库交互所花费的
  • python中有COMMIT模拟用于写入文件吗?

    我有一个打开的文件可供写入 并且有一个运行了数天的进程 在相对随机的时刻将某些内容写入文件中 我的理解是 直到我执行 file close 之前 有可能没有任何内容真正保存到磁盘上 真的吗 如果主进程尚未完成时系统崩溃怎么办 有没有一种方法
  • 无法调用不带参数的类型的初始值设定项 - Swift

    我正在从 Objective C 转向 Swift 我想做的只是创建一个类的实例 以便我可以访问该类的属性 var myClassInstance MyClass print length is myClassInstance variab
  • “文件名 062014.xlsx 未被识别为 OLE 文件”

    我正在开发一个处理 Excel 的复杂程序 因此我使用 PHPExcel 从浏览器搜索和编辑 Excel 文件 我的问题出在程序的编辑部分 所以我编写了一个基本程序来编辑现有的 Excel 页面 PHPExcel 似乎无法将 Excel 中
  • 无法构造 `reactor.core.publisher.Mono` Spring Cloud OpenFeign 和 Spring boot 2 的实例

    Goal 从 Spring Boot 1 x webMvc 迁移到版本 2 webFlux 从 Spring Cloud Edgware SR2 迁移到 FinchleyM8 等待发布版本 Problem Feign gt OpenFeig
  • 特殊字符的后备字体

    我想知道在使用 font face 时是否可以进行后备设置 以便如果我的页面上的文本包含字体中未考虑的字符 例如日语字符 则只有这些字符显示在基本字体而其他所有字符仍保留为自定义字体 我想象有时一个段落中可能会混合使用两种字体 您所描述的是
  • Couchbase 基准测试显示 INSERT 和 GET 非常慢(使用 KeyValue 操作);比持久化 MySQL 数据慢

    我做了一个小型基准测试 将 Couchbase 在 Win 中运行 与 Redis 和 MySql 进行比较 编辑 添加了 Aerospike 进行测试 我们将 100 000 个 JSON 文档 插入到三个数据库 存储中 Redis 只是
  • 解决mysql最大用户连接错误的正确方法

    我在用着PHP with MYSQL数据库 因为两者都是开源且易于使用的 我执行时遇到问题insert and or update of 数百万行相继 当这个操作执行时我得到了MYSQL错误是 max user connections ac
  • 如何选择外接麦克风

    我已经成功为 iOS 编写了一个使用 AVAudioRecorder 的简单录音应用程序 到目前为止 它可以与内置麦克风或插入耳机插孔的外部麦克风配合使用 如何选择通过 USB 闪电端口 连接的音频源 我必须深入研究核心音频吗 具体来说 我
  • \d 和 \d+ 之间有区别吗? [复制]

    这个问题在这里已经有答案了 https www freecodecamp com challenges find numbers with regular expressions https www freecodecamp com cha
  • 不使用“final”怎么会成为安全问题呢?

    摘自 O Reilly s 第 113 页基本 ActionScript 3 0 2007 最终方法有助于隐藏类的内部细节 制作一个类或一个 方法final阻止其他程序员扩展类或重写 用于检查类内部结构的方法 这样的预防 被认为是方法之一保
  • 如何为同一项目中的不同构建指定不同的 .dockerignore 文件?

    我曾经列出过tests目录在 dockerignore这样它就不会包含在我用来运行网络服务的图像中 现在我尝试使用 Docker 来运行我的单元测试 在本例中我想要tests包含目录 我查过docker build h并没有找到相关的选项
  • Freemarker 在模板中打印日期

    我试图在激活模板时打印当前日期 我读过 我必须将一个新的 Date Java 对象传递给模板 但我不知道如何执行此操作或将其放在代码中的位置 在这种情况下 有人知道如何将 Java 对象传递给模板吗 谢谢 实际上你不必通过new Date
  • 带有 ModelStateWrapper 的控制器 ModelState

    大家好 我正在使用结构图来实现依赖注入 我创建了 ModelStateWrapper 类来在服务层发送模型状态 该类在构造函数中获取对控制器 ModelState 的引用 在引导程序中我注册了我的类型 ForRequestedType
  • 为什么 parseInt(8,3) == NaN 和 parseInt(16,3) == 1?

    我正在阅读this http jibbering com faq notes type conversion 但我对里面写的内容感到困惑带有基数参数的 parseInt chapter 为什么会这样parseInt 8 3 NaN and
  • 限制 Visual VM 中的分析

    我正在尝试新 JDK 附带的 VisualVM 程序 我正在对其进行分析 并尝试仅对特定包中的方法进行 CPU 分析 我将以下内容放入 仅配置文件类 中 jig 其中 jig 是我想要检测的包 不幸的是 我得到了不在该包或任何子包中的其他方
  • 无法硬链接 gitconfig 文件

    我正在尝试创建一个 git 存储库来存储我的所有点文件和配置文件 我的想法是简单地创建指向我关心的所有文件的硬链接 并将这些链接存储在它们自己的目录中 我可以将其转变为存储库 我的 gitconfig 文件遇到了一些障碍 似乎每当我运行 g
  • 如何在 vb.net 中的 XML 文件生成中使用“<”或“&”等特殊字符

    我将一个数组传递给一个函数 该函数将数组转换为 XML 但我无法使用特殊字符 例如 lt or 当我传递这些时 它给出错误无效的 XML 文件 Protected Sub drawgraph ByRef dt As DataTable By
  • 驱动程序:org.postgresql.Driver@3ed03652 返回 null 的 URL...在 Spring Boot 部署到 Heroku 时

    我尝试在 Heroku 上部署我的应用程序 但遇到一些无法修复的错误 我的应用程序 poperties spring mvc view prefix WEB INF view spring mvc view suffix jsp sprin
  • 如何防止 System.Xml.XmlException:给定编码中的字符无效

    我有一个用 C 编写的 Windows 桌面应用程序 它循环访问存储在磁盘上并由第 3 方程序创建的一堆 XML 文件 大多数文件都由以下语句后面的 LINQ 代码成功加载和处理 XDocument xmlDoc XDocument Loa