0

我想在需要时打开/关闭Indenta 的属性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 问题中读过不可能多次设置此属性......但是......如果使用 aXmlTextWriter而不是XmlWriter我可以打开/随时关闭缩进,并注意到 aXmlTextWriter来自 Framework 2.0,所以我无法相信没有办法修改 Indent 属性,因为 ClassXmlWriterXmlTextWriter.

我不会使用 theXmlTextWriter而不是XmlWriter仅仅因为它XmlWriter在未来的日子里可能会完全过时,我更喜欢使用框架当前类的逻辑并且不将我的代码基于旧类。

此外,我不会做一些棘手的事情,例如“使用 WriteString 方法禁用缩进和写换行符”,因为这会在某些行引发异常。

澄清一下,我只想打开/关闭一个XmlWriter或一个 devired 和工作方式的 indent 属性,以便在我想要的时候打开/关闭缩进,而不是我不会做的任何其他事情。

这是代码,当我尝试修改 Indent 属性说它只是读取属性时,它会引发异常,但就像我说过的那样,我可以这样做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
4

2 回答 2

2

XmlWriterSettings在您创建编写器实例时立即应用于整个编写器,然后切换到只读模式。只有一种可能的方法可以关闭此模式 - 使用XmlWriterSettings.Reset()方法,但我不确定它是否可以帮助您。 XmlTextWriter有自己的缩进格式选项,它会在每个元素写入步骤中检查它们。换句话说, XmlTextWriter使用自己的函数编写缩进,而不使用 xmlwriter 缩进属性。因此,您只有一个可行的决定 - 为元素编写实现自定义逻辑,您可以:

  • 覆盖默认行为,例如检查元素名称(如“歌曲”)并省略无用的缩进符号
  • 关闭 XmlWriter indents ( XmlWriterSettings.Indent = false) 并添加您自己的方法,该方法将在您需要时手动编写缩进
于 2013-10-23T13:34:17.377 回答
1

您不能设置 XmlWriter 的缩进设置。但是您可以将 xmlSetting 对象传递给Write_SongInfo_Node过程并设置xmlSetting .Indent = True or False 希望它有效。

问候,

于 2013-10-23T12:25:27.547 回答