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
Twitterまとめ投稿 2019/07/20 [Twitter]
carbonhydratRT @Mkandhi091: こういう人がまさにファシズムを引き寄せている。この皮肉がまさに戦前に起きたことだよ。脅威を外に置いて平和のために戦争を始めたあの時代。この上から人を罵倒し脅す態度が前から書いてるけど権威主義者の典型。このまま改憲されたらこの人たちの天国になるよ。…07/19 15:25 carbonhydratRT @galaxy14141356: 京アニが破壊されたというオタク的なつらさよりも、頑張って努力して創作に人生かけたクリエイターやその作品が、一人の狂人による避けられないアクシデントで滅茶苦茶にされたという理不尽さと胸糞さによるダメージが大きいな07/19 15:29 carbonhydratRT @kumikokatase: 【#ネット中傷】 このケースは、ツイッターで中傷投稿をした人物を私が訴えたものです。 ネット中傷であっても、裁判で約270万円の損害賠償が認められた事例として、よく覚えておいて下さい。なお、この損害賠償が認められたツイートをツイッター社は「ル…07/19 15:31 carbonhydratRT @mipom11: 首相なら、野党批判のセコい演説ばかりせず、横綱の振る舞いを見せて欲しいもの。しかも震災時の民主党の対応を批判し「あの悔しさが原点!」なんて言っていうが、あの時自民は政権奪取に必死で、震災対策に全く協力しなかった。どの口でそんな嘘をつけるのか?「恥を知れ…07/19 15:33
2019-07-20 05:01
コメント(0)