XMLファイルのインデント整形

以下の投稿の追加説明です。

XMLのインデント整形する前は、以下のように、改行もインデントもありません。

<?xml version="1.0" encoding="utf-8"?>
<all><row><A attrid="attrV"><AA>データ1</AA><C id="text">データ2</C></A><D><E>データ3</E><F>データ4</F></D><G><H><I klm="post"><J year="2024">データ5</J><K>データ6</K></I><L>データ7</L></H><M>データ8<N>データ9</N></M></G><O>データ10</O></row><row><A attrid="attrV"><AA>データ11</AA><C id="text">データ12</C></A><D><E>データ13</E><F>データ14</F></D><G><H><I klm="post"><J year="2024">データ15</J><K>データ16</K></I><L>データ17</L></H><M>データ18<N>データ19</N></M></G><O>データ20</O></row><row><A attrid="attrV"><AA>21</AA><C id="text"></C></A><D><E>23</E><F>24</F></D><G><H><I klm="post"><J year="2024"></J><K>26</K></I><L></L></H><M>28<N></N></M></G><O></O></row></all>

以下のマクロにより、整形できます。

    ' xmlのインデント整形
    xw.CodeBeautify

XMLのコードを整形し、インデントを整えます。XmlWriterクラスに設定されている以下「CodeBeautify」を実行します。

' xmlのインデント整形
' https://teratail.com/questions/118314
Public Sub CodeBeautify()
    
    'Reader/Writerを用意する
    Dim oXmlReader As New SAXXMLReader60
    Dim oXmlWriter As New MXXMLWriter60
    
    'Writerでインデント設定する
    oXmlWriter.indent = True
    
    'ReaderとWriterを紐づける
    Set oXmlReader.contentHandler = oXmlWriter
    
    '作成したXMLをReaderで読み込む
    oXmlReader.Parse xmlDocument.XML
    
    '出力用DOMにWriterの整形結果を読ませる
    xmlDoc2.LoadXML oXmlWriter.output
End Sub

このマクロにより、改行やインデントが追加され、見やすくなります。

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<all>
	<row>
		<A attrid="attrV">
			<AA>データ1</AA>
			<C id="text">データ2</C>
		</A>
		<D>
			<E>データ3</E>
			<F>データ4</F>
		</D>
		<G>
			<H>
				<I klm="post">
					<J year="2024">データ5</J>
					<K>データ6</K>
				</I>
				<L>データ7</L>
			</H>
			<M>データ8<N>データ9</N>
			</M>
		</G>
		<O>データ10</O>
	</row>
	<row>
		<A attrid="attrV">
			<AA>データ11</AA>
			<C id="text">データ12</C>
		</A>
		<D>
			<E>データ13</E>
			<F>データ14</F>
		</D>
		<G>
			<H>
				<I klm="post">
					<J year="2024">データ15</J>
					<K>データ16</K>
				</I>
				<L>データ17</L>
			</H>
			<M>データ18<N>データ19</N>
			</M>
		</G>
		<O>データ20</O>
	</row>
	<row>
		<A attrid="attrV">
			<AA>21</AA>
			<C id="text"/>
		</A>
		<D>
			<E>23</E>
			<F>24</F>
		</D>
		<G>
			<H>
				<I klm="post">
					<J year="2024"/>
					<K>26</K>
				</I>
				<L/>
			</H>
			<M>28<N/>
			</M>
		</G>
		<O/>
	</row>
</all>

ただし、1行目が、書き換えられてしまいました。整形前は

<?xml version="1.0" encoding="utf-8"?>

だったのに、以下に、変わってしまいました。

<?xml version="1.0" encoding="UTF-16" standalone="no"?>

そこで、以下のマクロにより、戻しました。

    ' UTF-16からUTF-8に変換
    xw.ChangeEncoding

UTF-16形式からUTF-8形式にエンコーディングを変換します。XmlWriterクラスに設定されている以下「ChangeEncoding」を実行します。

' XMLファイルのencodingの変更
' https://tsuyorid.hatenadiary.org/entry/20051216/p2
Public Sub ChangeEncoding()
    ' UTF-16からUTF-8に変換
    Dim domDecXml As IXMLDOMProcessingInstruction
    'UTF-8に変換
    Set domDecXml = xmlDoc2.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
    '元々のencodingを無視して変更する
    Call xmlDoc2.replaceChild(domDecXml, xmlDoc2.FirstChild)
End Sub

このマクロを実行すると、以下の通り、元に戻りました。

<?xml version="1.0" encoding="UTF-8"?>

原因はわかりませんが、元に戻ってよかったです。

以下が、このExcelファイルです。

この投稿に関する追加解説です。

Follow me!