我可以更改XmlReader.Settings吗?

问题描述:

我是一个库,它有一个从提供的XmlReader中解析XML的方法。所以,调用者向我传递了XmlReader实例(或任何派生类的实例),但我需要确保忽略空白。即我想这样做:我可以更改XmlReader.Settings吗?

xmlReader.Settings.IgnoreWhitespace = true; 
// Then do my parsing 
// Finally, revert to whatever state xmlReader.Settings had prior to calling my method 

但是,如果创建的XmlReader实例时,呼叫者没有实例XmlReaderSettings,我不明白我怎么能这样解决我自己的方式。

例如,如果主叫方使用此代码:

XmlReader reader = new XmlTextReader(File.OpenRead("file.xml")); 

reader.Settings将保持为空。此属性是只读的,因此我无法分配它。

我对调用者不负责,我不强迫他们使用这种或那种获取XmlReader实例的方式并对其进行配置。我知道XmlTextReader已被弃用,但它仍然可以在.NET 4.6中使用,并且人们可以使用它。

这是否意味着我的库中没有办法解决这个问题,并且它的调用者必须为我提供已配置好的XmlReader?

你可以用提供的XmlReader到使用XmlReader.Create()一个新问题:

public void ReadMyXml(XmlReader reader) 
{ 
    XmlReaderSettings settings = reader.Settings ?? new XmlReaderSettings(); 
    settings.IgnoreWhitespace = true; 
    settings.CloseInput = false; 
    using(XmlReader myReader = XmlReader.Create(reader, settings)) 
    { 
     // use myReader to read the xml 
    } 
} 

设置settings.CloseInput = false如果你想避免在年底关闭原始读卡器(感谢乔恩·汉纳的评论)

+0

'settings.CloseInput'应该控制最后一个方面。 –

+0

@JonHanna thx,不知道。我会添加它。 –

+0

谢谢。但是,在我的测试'settings.CloseInput = false'没有任何效果。在'使用'作用域结束后,reader.ReadState立即变为关闭状态。 – Alex