golangでUPnPのポートフォワーディングをしてみる2−不定形のXMLをどうにかしようとする [プログラミング]
ルーターの持っているXMLが不定形なので、XMLとしては悪手なのではと思わざるを得ないのだけれども、DTDがあるわけでもなさそうなので、XMLの中を検索する他なさそうな気がします。構造化されているXMLをパースする例はいくらでもあるけど、不定形のXMLをどうにかするという記事がこれまたない。ググり方が悪いのかな?
一番雑音が少なさそうなコードがこれあたりで
https://hogesuke.hateblo.jp/entry/2014/08/25/012114
やっぱり構造体ときちんと定義しないといけないみたい。
Unmarshal()が出力するのはinterface{}で、具体的には構造体のようです。ふつう構造体自体は検索して使うものでもないので、XMLの型を作っておいてそこに当てはめるという方法は当然だったりします。実際、XMLからデータを引っ張ってくるサンプルはほぼ全部構造体を定義していますね。まぁXHTMLみたいな不定形なXMLも存在するので、そこのところを拾えない作りになっていると汎用性がない気がするんですがね。
Golangの構造体の検索を調べた方が良さそうな気がしますが、なんかなさそうな気がするんだよなぁ。LL言語あたりだと言語仕様か標準ライブラリのあたりにありそうな気はする。ググっていたらJSONをUnmarshalするということが書いてあって、JSONだと不定形なことも多いだろうと思って読んでみた。
https://www.kaoriya.net/blog/2016/06/25/
ゆるふわ、ねぇ。XMLでもできそうだなと思ったができなかった。
具体的には空のinterface{}にUnmarshal()で入れたんだけど、nilが返ってきました。よく読んだらきちんと構造体を作らないと空で返すよと書いてありました。形式は合っていてもvalに適合しないデータは破棄されます、って書いてあった。
http://golang.jp/pkg/xml
ううむ、一つずつ要素をクロールして行くような方法でいいからないのかな? でも、英語の文章を読んでいくのはしんどい。日本のリファレンスだってサンプルコードがない関数なんて暗闇の中で手探りしているようなもんだし。あんまり試行錯誤はしたくないんだよね。
不定形のXMLを扱う方法があった。
http://golang.rdy.jp/2015/11/08/anyxml/
UnmarshalXML()を独自に定義すればいいらしいんだが、サンプルではUnmarshalXML自体は呼んでない。Golangの仕組みとライブラリの問題なんだろうけど、いまいち細かくはよくわからない。
xml.Marshaler と xml.Unmarshaler interfaceを明示的に定義するっていうのがあったけど、別にこれはしなくてもいいってことなのかな。
https://qiita.com/ono_matope/items/70080cc33b75152c5c2a#xmlmarshaler-%E3%81%A8-xmlunmarshaler-interface
とにかく一つずつ拾っていく方法をとれるっぽいので、forで該当の情報を取れるまでぐるぐる回してみれば良さそうな気がする。そうなるとUnmarshalXMLは使わないでできるのかもしれない。使った方が楽かな? よくわからないけど実装できればいいや。
http://golang.rdy.jp/2015/11/08/anyxml/
のUnmarshalXML()だけをとって、情報を構造体にぶっこみたかったんだけど上手くいかず。
MarshalXML()もコピペして入れ込んだんだけど、内容が重複したり入れ子部分がざっくり無くなっていたり、まともに動いてくれていなかった。これは上のコードに自分が取ってきたXMLぶっ込んで試してみた方が良さそうだな。
やっぱり自分が取ってきたXMLを喰わせたら、階層を無視して途中でぶっちぎれて途中から続いた。汎用性がないらしい。あ〜自作かぁ。プログラミングするの面倒くさいなぁw。始めてしまえば楽しくなってきたりはしたりもするのだが、自分の用をなすものを作っても汎用性のあるコードは書きそうもないな。
とにかく、普通の正攻法ではできないとわかったので、地道にカスタマイズをかけるようにやるしかないかなと思ったり。なんとなくやり方の方針はわかったので、あとは似たようなコードとリファレンスを首っぴきにしてやるしかないかな。XMLだからもうちっとやり方が提供されていると思ったけど、薄っぺらなそこはGolangであるってことなんだろうな。
一番雑音が少なさそうなコードがこれあたりで
https://hogesuke.hateblo.jp/entry/2014/08/25/012114
やっぱり構造体ときちんと定義しないといけないみたい。
Unmarshal()が出力するのはinterface{}で、具体的には構造体のようです。ふつう構造体自体は検索して使うものでもないので、XMLの型を作っておいてそこに当てはめるという方法は当然だったりします。実際、XMLからデータを引っ張ってくるサンプルはほぼ全部構造体を定義していますね。まぁXHTMLみたいな不定形なXMLも存在するので、そこのところを拾えない作りになっていると汎用性がない気がするんですがね。
Golangの構造体の検索を調べた方が良さそうな気がしますが、なんかなさそうな気がするんだよなぁ。LL言語あたりだと言語仕様か標準ライブラリのあたりにありそうな気はする。ググっていたらJSONをUnmarshalするということが書いてあって、JSONだと不定形なことも多いだろうと思って読んでみた。
https://www.kaoriya.net/blog/2016/06/25/
ゆるふわ、ねぇ。XMLでもできそうだなと思ったができなかった。
具体的には空のinterface{}にUnmarshal()で入れたんだけど、nilが返ってきました。よく読んだらきちんと構造体を作らないと空で返すよと書いてありました。形式は合っていてもvalに適合しないデータは破棄されます、って書いてあった。
http://golang.jp/pkg/xml
ううむ、一つずつ要素をクロールして行くような方法でいいからないのかな? でも、英語の文章を読んでいくのはしんどい。日本のリファレンスだってサンプルコードがない関数なんて暗闇の中で手探りしているようなもんだし。あんまり試行錯誤はしたくないんだよね。
不定形のXMLを扱う方法があった。
http://golang.rdy.jp/2015/11/08/anyxml/
UnmarshalXML()を独自に定義すればいいらしいんだが、サンプルではUnmarshalXML自体は呼んでない。Golangの仕組みとライブラリの問題なんだろうけど、いまいち細かくはよくわからない。
xml.Marshaler と xml.Unmarshaler interfaceを明示的に定義するっていうのがあったけど、別にこれはしなくてもいいってことなのかな。
https://qiita.com/ono_matope/items/70080cc33b75152c5c2a#xmlmarshaler-%E3%81%A8-xmlunmarshaler-interface
とにかく一つずつ拾っていく方法をとれるっぽいので、forで該当の情報を取れるまでぐるぐる回してみれば良さそうな気がする。そうなるとUnmarshalXMLは使わないでできるのかもしれない。使った方が楽かな? よくわからないけど実装できればいいや。
http://golang.rdy.jp/2015/11/08/anyxml/
のUnmarshalXML()だけをとって、情報を構造体にぶっこみたかったんだけど上手くいかず。
MarshalXML()もコピペして入れ込んだんだけど、内容が重複したり入れ子部分がざっくり無くなっていたり、まともに動いてくれていなかった。これは上のコードに自分が取ってきたXMLぶっ込んで試してみた方が良さそうだな。
やっぱり自分が取ってきたXMLを喰わせたら、階層を無視して途中でぶっちぎれて途中から続いた。汎用性がないらしい。あ〜自作かぁ。プログラミングするの面倒くさいなぁw。始めてしまえば楽しくなってきたりはしたりもするのだが、自分の用をなすものを作っても汎用性のあるコードは書きそうもないな。
とにかく、普通の正攻法ではできないとわかったので、地道にカスタマイズをかけるようにやるしかないかなと思ったり。なんとなくやり方の方針はわかったので、あとは似たようなコードとリファレンスを首っぴきにしてやるしかないかな。XMLだからもうちっとやり方が提供されていると思ったけど、薄っぺらなそこはGolangであるってことなんだろうな。
タグ:Golang
コメント 0