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:
-
<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">
-
</office><office :meta>
-
<meta :creation-date>2009-08-11T09:32:05</meta>
-
<dc :date>2009-08-11T09:35:06.48</dc>
-
<meta :editing-duration>PT00H03M08S</meta>
-
<meta :editing-cycles>2</meta>
-
<meta :generator>OpenOffice.org/3.0$Win32 OpenOffice.org_project/300m9$Build-9358</meta>
-
<dc :description>これはOpenOfficeのドキュメントです。</dc>
-
<meta :keyword>OpenOffice</meta>
-
<meta :keyword>XML</meta>
-
<meta :keyword>操作</meta>
-
<dc :subject>サブジェクト</dc>
-
<dc :title>これはタイトル</dc>
-
<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"/>
-
<meta :user-defined meta:name="Info 1"/>
-
<meta :user-defined meta:name="Info 2"/>
-
<meta :user-defined meta:name="Info 3"/>
-
<meta :user-defined meta:name="Info 4"/>
-
</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オブジェクトです。)

