Screaming Loud

日々是精進

goaでXMLを生成する

goaとはgoのWebフレームワークです。

goa.design

goでリクエストとレスポンスを定義してあげると、APIとswagger周りを生成してくれるので、便利なライブラリです。

詳しくはこちら

The goa API Design Language · goa :: Design-first API Generation

今回goaでjsonの例はあるのですが、XMLの生成のサンプルがないので作りました。 基本的にはgoの encodign/xml を参考にすればできました。

design

基本的には Attribute を追加すると、タグの間に挿入されます。

属性やCDATAなど内容以外のものはMetadataとしてAttributeに定義してあげると反映されます。

design

xmlとそれに対応したgoaの書き方をまとめます。

ベース

<User></User>
var User = MediaType("vnd.application/user+xml", func() {
    TypeName("User")
    ContentType("application/xml")
})

属性

<User id="1234"></User>
var User = Type("User", func() {
    Attribute("ID", String, "user id", func() {
        Metadata("struct:tag:xml", "id,attr")
    })
    Required("ID")
})

Metadata内の id が属性名で、attrは属性であることを明示している。

内容

<User>
  <Name>太郎</Name>
</User>
var User = Type("User", func() {
    Attribute("Name", String)
})

CDATA

<URL><![CDATA[http://www.google.com]]></URL>
var URL = Type("URL", func() {
    Attribute("CDATA", String, func() {
        Metadata("struct:tag:xml", ",cdata")
    })
})

属性と同じように cdata はcdataであることを示している。 キー名はないので空。

配列

<User>
   <Friend>次郎</Friend>
   <Friend>三郎</Friend>
</User>
var User = Type("User", func() {
    Attribute("Friend", ArrayOf(String))
})