Cita de: Ikillnukes en 8 Agosto 2014, 17:11 PM
Creo que algunas de estas utilidades están ya presentes dentro de lo que es la super colección de Elektro, pero bueno supongo que un indentador XML nunca se ha visto por aquí así que aquí va:
precisamente estoy harto de que cierta utilidad de Microsoft me genere los archivos de manifiesto sin ningún tipo de indentación, esto me sirve .
EDITO: en un principio iba a ahorrarme comentarios sobre posibles mejoras de código o etc, pero hay un fallo importante que se debe corregir, no estás liberando el memorystream:
CitarCódigo (vbnet) [Seleccionar]Dim w As New MemoryStream()
Ni tampoco el Writer ni el Reader xD
Por cierto la Class XMLTextWriter está obsoleta, en su defecto Microsoft recomienda el uso de XMLWriter.
EDITO 2: Me he tomado la libertad de editar el código original enfocándolo de otra manera (aunque tampoco es tan distinto):
Ejemplo de uso:
Código (vbnet) [Seleccionar]
Dim TextEncoding As System.Text.Encoding = System.Text.Encoding.Default
Dim UnformattedXMLDocument As String = IO.File.ReadAllText("C:\Unformatted Document.xml", TextEncoding)
Dim FormattedXMLDocument As String = XMLBeautify(XMLText:=UnformattedXMLDocument,
IndentChars:=New String(" "c, 2),
IndentOnAttributes:=False,
TextEncoding:=TextEncoding)
IO.File.WriteAllText("C:\Formatted Document.xml", FormattedXMLDocument, TextEncoding)
Snippet:
Código (vbnet) [Seleccionar]
''' <summary>
''' Beautifies the contents of an unindented XML document.
''' </summary>
''' <param name="XMLText">
''' The XML text content.
''' It can be an entire document or a fragment.
''' </param>
''' <param name="IndentChars">
''' The string that is used to indent the XML.
''' Default value is: <see cref="ControlChars.Tab"/>
''' </param>
''' <param name="IndentOnAttributes">
''' If set to <c>true</c>, attributes will be separated by newlines.
''' Default value is: <c>false</c>
''' </param>
''' <param name="TextEncoding">
''' The XML text encoding to use.
''' Default value is: <see cref="System.Text.Encoding.Default"/>.
''' </param>
''' <returns>The beautified XML text.</returns>
''' <exception cref="System.ArgumentNullException"></exception>
Public Shared Function XMLBeautify(ByVal XMLText As String,
Optional ByVal IndentChars As String = Nothing,
Optional ByVal IndentOnAttributes As Boolean = False,
Optional ByVal TextEncoding As System.Text.Encoding = Nothing) As String
If String.IsNullOrEmpty(XMLText) Then
Throw New ArgumentNullException(XMLText)
End If
Dim sb As New System.Text.StringBuilder
Dim doc As New Xml.XmlDocument()
Dim settings As New Xml.XmlWriterSettings
With settings
.Indent = True
.CheckCharacters = True
.OmitXmlDeclaration = False
.ConformanceLevel = Xml.ConformanceLevel.Auto
.NamespaceHandling = Xml.NamespaceHandling.Default
.NewLineHandling = Xml.NewLineHandling.Replace
.NewLineChars = ControlChars.NewLine
.NewLineOnAttributes = IndentOnAttributes
.IndentChars = If(IndentChars IsNot Nothing, IndentChars, ControlChars.Tab)
.Encoding = If(TextEncoding IsNot Nothing, TextEncoding, System.Text.Encoding.Default)
End With
Using writer As Xml.XmlWriter = Xml.XmlWriter.Create(sb, settings)
doc.LoadXml(XMLText)
doc.WriteContentTo(writer)
writer.Flush()
Return sb.ToString
End Using
End Function
''' <summary>
''' Beautifies the contents of an unindented XML document.
''' </summary>
''' <param name="XMLFile">
''' An <see cref="T:IO.FileInfo"/> that contains the XML info.
''' It can be an entire document or a fragment.
''' </param>
''' <param name="IndentChars">
''' The string that is used to indent the XML.
''' Default value is: <see cref="ControlChars.Tab"/>
''' </param>
''' <param name="IndentOnAttributes">
''' If set to <c>true</c>, attributes will be separated by newlines.
''' Default value is: <c>false</c>
''' </param>
''' <param name="TextEncoding">
''' The XML text encoding to use.
''' Default value is: <see cref="System.Text.Encoding.Default"/>.
''' </param>
''' <returns>The beautified XML text.</returns>
''' <exception cref="System.ArgumentNullException"></exception>
Public Shared Function XMLBeautify(XMLFile As IO.FileInfo,
Optional ByVal IndentChars As String = Nothing,
Optional ByVal IndentOnAttributes As Boolean = False,
Optional ByVal TextEncoding As System.Text.Encoding = Nothing) As String
Return XMLBeautify(IO.File.ReadAllText(XMLFile.FullName, TextEncoding), IndentChars, IndentOnAttributes, TextEncoding)
End Function
Posibles outputs:
1º:
Código (xml) [Seleccionar]
<savedata>
<SoftwareType>Freeware</SoftwareType>
<SoftwareID>Moo0 FileMonitor</SoftwareID>
<Version>1.11</Version>
<MainWindow>
<SoftwareType>Freeware</SoftwareType>
<SoftwareID>Moo0 FileMonitor</SoftwareID>
<Version>1.11</Version>
<View F="0" E="0" D="0" RefreshFrequency="500" LogUpTo="20000" EasyDrag="1" Maximized="0" X="958" Y="453" Width="962" Height="585" KeepOnTop="0"></View>
<ChangesColumnOrder length="6" _0="0" _1="1" _2="2" _3="3" _4="4" _5="5"></ChangesColumnOrder>
</MainWindow>
<Skin>Classic LG</Skin>
</savedata>
2º:
Código (xml) [Seleccionar]
<savedata>
<SoftwareType>Freeware</SoftwareType>
<SoftwareID>Moo0 FileMonitor</SoftwareID>
<Version>1.11</Version>
<MainWindow>
<SoftwareType>Freeware</SoftwareType>
<SoftwareID>Moo0 FileMonitor</SoftwareID>
<Version>1.11</Version>
<View
F="0"
E="0"
D="0"
RefreshFrequency="500"
LogUpTo="20000"
EasyDrag="1"
Maximized="0"
X="958"
Y="453"
Width="962"
Height="585"
KeepOnTop="0"></View>
<ChangesColumnOrder
length="6"
_0="0"
_1="1"
_2="2"
_3="3"
_4="4"
_5="5"></ChangesColumnOrder>
</MainWindow>
<Skin>Classic LG</Skin>
</savedata>
Saludos