【问题标题】:How to use XmlReader with behavior of XmlTextReader with Namespaces = false如何将 XmlReader 与 Namespaces = false 的 XmlTextReader 行为一起使用
【发布时间】:2016-06-09 00:07:13
【问题描述】:

我想使用流式 xml 解析器解析“无效”xml。 我有两个选择

XmlReader.Create(...,
    new XmlReaderSettings() 
{ 
    CheckCharacters = false, 
    ConformanceLevel = ConformanceLevel.Fragment, 
    ValidationFlags = System.Xml.Schema.XmlSchemaValidationFlags.None,
    ValidationType = ValidationType.None 
}))

第二个例子

new XmlTextReader(...) { Namespaces = false, Normalization = false })

首先是在 xml 中显示的无法识别的命名空间上失败:'...' is an undeclared prefix.

第二个是无效字符失败:XmlException: '', hexadecimal value 0x13, is an invalid character. Line ...

是否有一个选项可以结合这两种行为 (Namespaces = false && CheckCharacters = false) 以便解析不会在未定义的命名空间和无效字符上失败?

输入“xml”不能按原样更改。它也很大,无法加载到内存中。

更新 xml示例

<?xml version="1.0" encoding="UTF-8"?>
<x xmlns="http://www.w3.org/2005/Atom">
    <item>
        <my_ns:id>123 _0x13_here_ dd</my_ns:id>
        <other_ns:value>ABC</other_ns:value>
    </item>
</x>

_0x13_here_(char)'\x13' 我错了,在这里使用CheckCharacters = false 没有帮助。它只允许避免像 &amp;#x13; 这样的内容出现异常。

【问题讨论】:

  • 带有未声明命名空间前缀的 XML 不是“无效”,它的格式不正确。真的,我认为任何解析器读取它都不会很幸运。在XmlTextReader 中禁用命名空间支持只会意味着您会收到: 不允许在名称中出现的错误。
  • @CharlesMager 我添加了一个 xml 示例。 XmlTextReader { Namespaces = false } 能够毫无例外地读取具有该类型命名空间的 xml。
  • 请看我对类似问题的回答here

标签: c# xml xmlreader


【解决方案1】:

以下是一种组合解决方案:
- 多个根元素 (ConformanceLevel.Fragment)
- 未定义的前缀(AddNamespace)

var settings = new XmlReaderSettings() {
    NameTable = new NameTable(),
    ConformanceLevel = ConformanceLevel.Fragment
};
var nsmgr = new XmlNamespaceManager(settings.NameTable);
nsmgr.AddNamespace("MyNamespace", "http://exemple.com");
var context = new XmlParserContext(null, nsmgr, null, XmlSpace.Default);
var reader = XmlReader.Create(stream, settings, context );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2011-11-17
    • 2012-09-01
    • 2014-02-20
    相关资源
    最近更新 更多