XML は、JSON が現在ほど広く使用されていなかったときに非常に広く使用されていました。データ交換や情報伝達のフォーマットとしてXMLは今でも広く使われており、現在では多くのオープンプラットフォームインターフェースが基本的にXMLフォーマットをサポートしています。
Go 言語の組み込みの encoding/xml パッケージは、encoding/json パッケージと同様の方法で、構造体と XML 形式の間でエンコードおよびデコードするために使用できます。ただし、XML のエンコードとデコードは、機能的には JSON よりも要求が厳しくなります。これは、エンコーディング/xml パッケージでは、構造体のフィールドに整形式のタグが含まれる必要があるのに対し、JSON 形式ではその必要がないためです。
XMLファイルを書き込む
encoidng/xml パッケージを使用すると、XML データをファイルに非常に簡単に保存できます。サンプル コードは次のとおりです。
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Website struct {
Name string `xml:"name,attr"`
Url string
Course []string
}
func main{
//オブジェクトのインスタンス化
info:=ウェブサイト{"IT基礎", "https://it-kiso.com/golang/", []string{"Go言語入門チュートリアル", "Golang入門チュートリアル"}}
f、err:= os.Create("./info.xml")
if err!= nil {
fmt.Println("ファイルの作成に失敗しました", err.Error())
return
}
defer f.Close()
//ファイルへのシリアル化
encoder:= xml.NewEncoder(f)
err = encoder.Encode(info)
if err!= nil {
fmt.Println("エンコードエラー:", err.Error())
return
} else {
fmt.Println("エンコード成功")
}
}
上記のコードを実行すると、現在のディレクトリに info.xml ファイルが生成されます。ファイルの内容は次のとおりです。
<Website name=”IT基礎”>
<Url>https://it-kiso.com/golang/</Url>
<Course>Go言語入門チュートリアル</Course>
<Course>Golang入門チュートリアル</Course>
</Website>
XMLファイルを読み取る
XML ファイルの読み取りは、特に一部のカスタム フィールド (日付など) を処理する必要がある場合、XML ファイルの書き込みよりも若干複雑です。ただし、合理的な XML タグ付き構造を使用すれば、複雑なことはありません。サンプルコードは次のとおりです。
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Website struct {
Name string `xml:"name,attr"`
Url string
Course []string
}
func main() {
// XML ファイルを開く
file、err:= os.Open("./info.xml")
if err != nil: {
Printf("ファイルを開けなかった:%v", err)
return
}
defer file.Close()
info:= Website{}
decoder:= xml.NewDecoder(file)
err = decoder.Decode(&info)
if err:!= nill {
fmt.Printf("解析エラー:%v", err)
return
} else {
fmt.Println("OK")
fmt.Println(info)
}
}
XML を記述するときと同様に、読み取った XML データのエスケープを気にする必要はありません。xml.NewDecoder.Decode() 関数がこれを自動的に処理します。
XML パッケージは、ネストなどのより複雑なタグもサポートしています。たとえば、「xml:”Books>Author”」という名前のタグは、<Books><Author>content</Author></Books> のような XML コンテンツを生成します。同時に、パッケージは「xml:”、attr”」に加えて、フィールドを文字データとして書き込むための「xml:”、chardata”」のようなタグもサポートします。また、「xml:”、innerxml」のようなタグもサポートします。 ‘ はフィールドを文字通りに記述することを意味し、’xml:”,comment”‘ のようなタグはフィールドを XML コメントとして扱うことを意味します。したがって、タグ付き構造を使用することで、これらの便利なエンコードおよびデコード機能を最大限に活用しながら、XML データの読み書きを合理的に制御することができます。