2017-02-16 263 views
1

我是一個庫,它有一個從提供的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?

回答

1

你可以用提供的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

相關問題