Yahoo! APIで取得したXMLをXMLオブジェクトにしたのにXML演算子でアクセスしようとしても
値が存在しないとエラーになってしまった。
アクセス方法も間違ってないし、XMLもちゃんと読み込めてるのになぁと調べると
名前空間が指定されている場合はそれも考慮してアクセスする必要があるとのこと。
んで、三つの方法があるようだ。
- 名前空間オブジェクト経由(この方法)
- default xml namespace でディフォルト名前空間の書き換え
- 名前空間の指定(xmlns="hoge")を削除する
1.だと階層が深くなると面倒そう。子の取り出し方次第で工夫できそうだけど。
2.がアクセスが楽になるし、XMLソースに影響与えないから一番使いやすいかな。
3.は強引な手だけど、干渉さえしないなら問題無。ソースの書き換えがどうかはあるけど。
webとの連携で名前空間の処理は必須なことを学べた。
ってかこれに引っかかってぜんぜん進めなかったorz。
// --- 省略 ---
var urn:Namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル
見ればわかるようにいちいち名前空間経由でアクセスする必要があるので冗長になりがち。
2.の方法
default xml namespace ディレクティブ
default xml namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル
何故かサンプルのように、Namespaceオブジェクト作ってからやると変数が定義されていないって出る。
何か勘違いしてるかなぁ。とりま今回はおkとしておく。
3.の方法
Remove Annoying XML Namespaces in Flex/AS3
_xml = removeNs(_xml);
public function removeNs(_xml:XML):XML {
var _smlStr:String = _xml.toString().replace(new RegExp("(xmlns|xsi)[^\"]*\"[^\"]*\"", "gi"), "");
return new XML(_smlStr);
}
こんな感じでとにかく xmlns="hoe" とか xsi="hau" を消してしまえばよいだけ。
PR