使用LINQ覆盖或忽略C#中未声明的实体

时间:2011-11-17 16:08:54

标签: c# xml linq linq-to-xml

我有一个小实用程序,它使用LINQ查找XML文件中的某些内容。它可以非常快速而且很好地处理它们的大量集合。但是,由于程度符号在文件中的存在为°,因此某些批处理文件中约有20%无法读取并被跳过,因此失败。这是“对未申报实体'deg'的引用。”一个previous question即将来临。

上一个问题中提供的解决方案无法直接应用于此处。我不能自由地修改文件,并且复制它们以及替换实例或在副本中插入标签似乎效率低下。让LINQ忽略未声明的实体的最佳方法是什么,这与我的程序无关紧要?或者是否有一种很好的方法可以让XDocument.Load预先提供一些实体声明?

1 个答案:

答案 0 :(得分:2)

不幸的是,实体构成了XML(2.1 Well-Formed XML Documents)的格式良好规则的一部分。好像你说你希望XDocument.Load加载一个名义上是XML文件的东西,但实际上并不符合规则,这是不合理的。

如果您的用户向您传递了应该是XML文件但具有未定义实体的文件,那么您必须让他们以有效格式提供文件,或者在加载时管理您自己的错误,已建议的方式。

在我看来,根据您的限制,最新的方法是遵循链接的示例并创建一些settings以沿{(Validating an XML Document in the DOM的方式传递到XMLReader。 }})。

如果存在未定义且未在公共模式中列出的实体,则需要创建自己的模式,该模式定义了您需要的所有实体。因此,为引用您自己的自定义架构的settings创建一个通用XMLReader。将必要的实体添加到此模式,因为某些文件无法加载,然后您将构建一个列表,列出您需要定义的所有entite,以便XML文件有效。

然后,对于您尝试加载的每个文档,使用上面的XMLReader为该文件创建settings并调用XDocument(XMLReader)重载。