gpt4 book ai didi

c# - 如何创建忽略命名空间且不检查字符的 XmlTextReader

转载 作者:行者123 更新时间:2023-12-05 01:02:45 25 4
gpt4 key购买 nike

我想使用忽略命名空间且不检查字符的 XmlTextReader。要忽略命名空间,我可以设置属性 Namespaces=false 并且不检查字符我可以使用 XmlReaderSettings.CheckCharacters = false

我尝试使用它的构造函数创建 XmlTextReader,但这不允许我传入配置的 XmlReaderSettings。属性 Settings 是只读的,所以我无法在构造后设置它。

XmlTextReader reader = new XmlTextReader(gzs) { Namespaces = false};
reader.Settings = new XmlReaderSettings { CheckCharacters = false}; // readonly

使用基类XmlReader的静态方法Create()可以传入XmlReaderSettings,但是方法返回的是XmlTextReaderImpl 并且没有要设置的属性 Namespace 并且不能强制转换为 XmlTextReader

var settings = new XmlReaderSettings { CheckCharacters = false}; 
var reader = XmlTextReader.Create(gzs, settings);
XmlTextReader textReader = reader as XmlTextReader // not possible

那么我该如何创建这样一个 XmlTextReader 呢?甚至可能吗? XmlReaderSettings 上是否有任何属性可以忽略命名空间?

最佳答案

没那么难。

我的任务是反序列化相同结构的 xml 文件,可以有或没有默认命名空间声明。

首先我发现了 discussion使用 XmlTextReader 解决方案:NamespaceIgnorantXmlTextReader。但 MSDN 建议不要使用 XmlTextReader,而是使用 XmlReader。

所以我们需要在 XmlReader 上做同样的事情。

XmlReader 是一个抽象类,我们需要先做一个包装器。 Here是一篇好文章怎么做。和here是一个现成的 XmlWrappingReader。

然后我们需要扩展它:

public class XmlExtendableReader : XmlWrappingReader
{
private bool _ignoreNamespace { get; set; }

public XmlExtendableReader(TextReader input, XmlReaderSettings settings, bool ignoreNamespace = false)
: base(XmlReader.Create(input, settings))
{
_ignoreNamespace = ignoreNamespace;
}

public override string NamespaceURI
{
get
{
return _ignoreNamespace ? String.Empty : base.NamespaceURI;
}
}
}

就是这样。现在我们可以使用它来控制 XmlReaderSettings 和命名空间处理:

XmlReaderSettings settings = new XmlReaderSettings()
{
CheckCharacters = false,
ConformanceLevel = ConformanceLevel.Document,
DtdProcessing = DtdProcessing.Ignore,
IgnoreComments = true,
IgnoreProcessingInstructions = true,
IgnoreWhitespace = true,
ValidationType = ValidationType.None
};

using (XmlExtendableReader xmlreader = new XmlExtendableReader(reader, settings, true))
_entities = ((Orders)_serializer.Deserialize(xmlreader)).Order;

关于c# - 如何创建忽略命名空间且不检查字符的 XmlTextReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com