Archive for the ‘XML’ Category

名前空間付きのXMLのエレメントの取得方法は以前書いたが、名前空間付きの属性はどのように取得したらいいのだろうか?

下のような例で、sheet要素のr:id属性を取得してみようと思う。
(どこかで見たことあるようなXMLと思った方は、そう、そのデータを解析しているのです。)

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  <workbook
    xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  <fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505" />
  <workbookPr defaultThemeVersion="124226" />
  <bookViews>
  <workbookView xWindow="120" yWindow="120" windowWidth="14940" windowHeight="13500" />
  </bookViews>
  <sheets>
  <sheet name="Sheet1" sheetId="1" r:id="rId1" />
  <sheet name="Sheet2" sheetId="2" r:id="rId2" />
  <sheet name="Sheet3" sheetId="3" r:id="rId3" />
  </sheets>
  <calcPr calcId="114210" />
</workbook>
var _xml:XML = XML(data); <--  ここに上の例のXMLがある前提。
var _ns:Namespace  = _xml.namespace();
var _nsR:Namespace = _xml.namespace("r");

trace(_xml._ns::sheets._ns::sheet.(@sheetId == "1").@_nsR::id);

という感じで、通常のエレメントと同じように、@_nsR::id のようにすればいいようです。
ちなみに、XMLから値を取得するときに以下のように、条件を記述できるのです。

sheetId属性が"1"のsheet要素を取得するという意味です。

_xml._ns::sheets._ns::sheet.(@sheetId == "1");

これ、最近までしりませんでした。

たとえば、こんなXMLがある。

XML:
  1. <office :document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.2">
  2.   </office><office :meta>
  3.     <meta :creation-date>2009-08-11T09:32:05</meta>
  4.     <dc :date>2009-08-11T09:35:06.48</dc>
  5.     <meta :editing-duration>PT00H03M08S</meta>
  6.     <meta :editing-cycles>2</meta>
  7.     <meta :generator>OpenOffice.org/3.0$Win32 OpenOffice.org_project/300m9$Build-9358</meta>
  8.     <dc :description>これはOpenOfficeのドキュメントです。</dc>
  9.     <meta :keyword>OpenOffice</meta>
  10.     <meta :keyword>XML</meta>
  11.     <meta :keyword>操作</meta>
  12.     <dc :subject>サブジェクト</dc>
  13.     <dc :title>これはタイトル</dc>
  14.     <meta :document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="13" meta:word-count="665" meta:character-count="1725"/>
  15.     <meta :user-defined meta:name="Info 1"/>
  16.     <meta :user-defined meta:name="Info 2"/>
  17.     <meta :user-defined meta:name="Info 3"/>
  18.     <meta :user-defined meta:name="Info 4"/>
  19.   </office>

これは、OpenOfficeで作ったドキュメントファイル(odt)ファイルのから取り出したmeta.xmlだ。

通常、名前空間がなければ

var metas:XMLList = _xml.title;

のようにすればよい。
しかし、名前空間があるXMLの場合には、この名前空間を指定しなければいけない。

では、<dc:title />のように名前空間がある要素の取得は以下のようにする。

var _dcNS:Namespace = _xml.namespace("dc");
trace(_xml.dcNS::title);  //  これで「これはタイトル」の文字列が出力される

初めの例でいえば、_xml.title の title が _dcNS::title のようにNamespaceの変数名 + "::" + 要素名 にすればいいのだ。
これが、もっと深い子になると、非常に読みづらくなる。
(※:_xmlは上の内容のXMLオブジェクトです。)

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2010年3月
« 2月    
1234567
891011121314
15161718192021
22232425262728
293031  
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ