2013-10-23 32 views
0

我想打開/關閉一個XmlWriterIndent財產我需要的時候,能夠與這個格式來寫:如何打開/關閉XmlWriter縮進屬性?

<?xml version="1.0" encoding="Windows-1252"?> 
<Songs> 
    <Song><Name>My Song 1.mp3</Name><Year>2007</Year></Song> 
    <Song><Name>My Song 2.mp3</Name><Year>2009</Year></Song> 
    <Song><Name>My Song 3.mp3</Name><Year>2008</Year></Song> 
</Songs> 

的問題是我不知道如何修改屬性,我讀過其他SO問題,不可能多次設置此屬性...但是...如果使用XmlTextWriter代替XmlWriter我可以隨時打開/關閉縮進,並注意到一個XmlTextWriter來自Framework 2.0,所以我不能相信沒有辦法修改縮進屬性,因爲類XmlWriterXmlTextWriter要多得多。

我不會用XmlTextWriter代替XmlWriter只是因爲XmlWriter可能成爲未來的日子完全過時,我preffer使用框架當前類的邏輯,並不能立足於老班我的代碼。

此外,我不會做一些棘手的事情,比如「禁用縮進和用WriteString方法修改換行符」,因爲那會在特定行中拋出異常。爲了說明起見,我只想打開/關閉XmlWriter的縮進屬性,或者只要我想要打開/關閉縮進,但沒有其他我不會做的事情。

這裏是代碼,它引發一個異常,當我試圖修改縮進屬性說,這是隻讀屬性,但就像我說過的,我可以在XmlTextWriter所以...這似乎太奇怪了。

Dim xmlsettings As XmlWriterSettings = _ 
    New XmlWriterSettings() With { _ 
     .Indent = True, _ 
     .Encoding = System.Text.Encoding.Default} 

Dim Xml As XmlWriter = XmlTextWriter.Create(xmlfile, xmlsettings) 

Private Sub Write_SongInfo_Node(ByVal xml As XmlWriter, 
        ByVal Name As String, _ 
        ByVal Year As String) 

    xml.WriteStartElement("Song") 

    xml.Settings.Indent = False 

    xml.WriteStartElement("Name") 
    xml.WriteString(Name) 
    xml.WriteEndElement() 

    xml.WriteStartElement("Year") 
    xml.WriteString(Year) 
    xml.WriteEndElement() 

    xml.Settings.Indent = True 

    xml.WriteEndElement() 

    ' xml.WriteString(Environment.NewLine) 

End Sub 
+2

爲什麼的格式化了' xml的問題? – flindeberg

+2

@flindeberg可以說,你可以通過排除換行符和製表符來削減一些文件大小,但實際上,如果你不得不優化你的xml,xml是錯誤的技術。 – Gusdor

+1

@Gusdor在這種情況下,爲什麼不將'XmlWriterSettings.Indent'設置爲'false'並將其留在那裏呢?我想知道在這個特定的情況下,這是沒有意義的。 – flindeberg

回答

1

XmlWriterSettings當您創建作家實例被應用於整個作家在一次和比它切換到只讀模式。只有一種可能的方法來關閉此模式 - 使用XmlWriterSettings.Reset()方法,但我不確定它可以幫助您。 XmlTextWriter已經獲得了自己的縮進格式化選項,並在每個元素寫入步驟中檢查它們。換句話說,XmlTextWriter使用自己的函數寫入縮進並且不使用xmlwriter縮進屬性。 所以只有一個工作決定了你 - 落實元素寫在其中,你可以自定義邏輯:

  • 覆蓋默認行爲,例如檢查元素的名稱(如「宋史」),並忽略無用縮進符號
  • 開關關的XmlWriter縮進(XmlWriterSettings.Indent = false),並添加自己的方法,當你需要將手動編寫縮進它
1

您不能設置XmlWriter的縮進設置。但是您可以將xmlSetting對象傳遞給Write_SongInfo_Node過程,並設置xmlSetting .Indent = True or False 希望它起作用。

問候,