Hatena::Groupsubtech

#生存戦略 、それは

-> 07 { 02 / 11 }

AS3 の XML オブジェクトと namespace (xmlns)

00:07 | はてなブックマーク - AS3 の XML オブジェクトと namespace (xmlns) - #生存戦略 、それは

そもそも AS3 の XML オブジェクトというよりか E4X の話なのかなぁ。ほんの少しだけ解ってきた。AWSXML

<?xml version="1.0" encoding="UTF-8"?>
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
  </OperationRequest>
  <Items>
  </Items>
</ItemLookupResponse>

みたいになっている。んでこの String から XML オブジェクトを作って、x.Items でアイテム要素を取得しようとしても、

var x:XML = new XML(source); // AWS の XML
trace(x.Items); // 空

となってしまう。最初はめっちゃなやんだのだけど、xmlns で namespace を指定しているためにこういう挙動になることが解った。

なので QName を使って XML#descendants() メソッドを使って取得する。

var x:XML = new XML(source);
var ns:Namespace = x.namespace();
var qnItems:QName = new QName(ns, 'Items')
var items:XMLList = x.descendants(qnItems);
trace(items); // ちゃんと取得できる

でもその Items 配下の 要素にアクセスしようとすると

var x:XML = new XML(source);
var ns:Namespace = x.namespace();
var qn:QName = new QName(ns, 'Items')
var items:XMLList = x.descendants(qn);
var qni:QName = new QName(ns, 'Item')
var item:XMLList = items.descendants(qni);
trace(item);

と書くことになって超絶めんどくさい。超適当な解決としては元の String 状態の XML から xmlns を正規表現なりで削除することなんだけどあまりにもダメな解決策くさい。で、XML#removeNamespace() で名前空間を削除したらどうなんだろう、と思ったのだけど

 var x:XML = new XML(source);
 trace(x.namespaceDeclarations().length); // 1
 var ns:Namespace = x.namespace();
 x.removeNamespace(ns);
 trace(x.namespaceDeclarations().length); // 1

と削除されてないくさい。なんでー。というわけで AWS のような XML にすんなりアクセスする方法を募集中です。

brazilbrazil2007/02/12 16:30Oh sorry, boku tekitou ningen YO.

secondlifesecondlife2007/02/12 21:49I can understand.