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ファイルです。
シートからXML作成
1 ファイル 29.78 KB
この投稿に関する追加解説です。