XMLの扱い方

JavaからXMLファイル操作する方法

XMLファイルは
「<」と「>」でくくられたタグが
階層的に書かれているのが基本

ただ
タグ開始を数値演算子(不等号)と区別するため
「<」を「&lt」(less than)
「>」を「&gt」(greater than)
として表現するのが望ましい

つまり
「<」/「>」で書かれてるケースと
「&lt」/「&gt」で書かれてるケースとある
XMLを解析(アンマーシャル)する時は
上記4つを意識せんとNG

JavaでのXMLファイル解析用APIは主に2つ
DOM(Document Object Model)
SAX(Simple API for XML

DOM
最初にすべてのファイルの内容を読み込んで解析し
メモリ内にXMLの階層構造に合わせたDOMのオブジェクト群を構築する
XMLファイルの構造に合わせたオブジェクト群を一度に構築するため
メモリを食ってまうのと解析に時間かかるのがデメリット
構築されたオブジェクトをJavaプログラムから扱えるので直感的に操作できるのがメリット
複雑な操作をしたい場合には有効

//DOMを使用するために新しいインスタンスを生成する
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//Documentインスタンス用factoryを生成する
DocumentBuilder builder = factory.newDocumentBuilder();
//解析対象のファイルをDocumentクラスのオブジェクトにする
Document doc = builder.parse(new File("Sample.xml"));
//DocumentオブジェクトからXMLの最上位のタグであるルートタグを取得する
Element root = doc.getDocumentElement();
//最初のノードを取得する
Node node = root.getFirstChild();
System.out.print(node.getNodeValue());

SAX
XMLファイルを先頭から読み込んでいき
タグを検知する毎にイベント通知する
このイベントの通知に対して
実行したい処理を記述する
DOMに比べメモリ容量は少なくて済むのと
解析速度が速いのがメリット



DOMでのXML操作
DOMオブジェクトでは
XMLの階層構造を木構造で表す

「ノード」
木構造を構成する要素(Element)のこと
「属性(Attribute)」や「テキスト」で構成される
最上位ノードは XMLファイルそのものになる

□解析手順
解析ターゲット
<'?xml version="1.0" encoding="Shift _ JIS" ?>
<'sample>テストです!<'/sample>

DocumentBuilderFactoryからオブジェクトを生成する

解析対象となるXMLファイルからXMLファイルを抽象化したDocumentクラスのオブジェクトを取得する

DocumentオブジェクトからXMLの最上位のタグ(ルート タグ)を取得する

sampleタグの最初のタグの中身であるノードを取得する

ノードから内容を取得する

XXX

tag : XML DOM SAX XXX

2009-10-31 17:01 : __lang__xml : コメント : 0 : トラックバック : 0 :

JAXP

JAXP(Java API for XML Parsing)
XMLドキュメントをParsing(解析)するためのJavaのAPI

JAXP 1.0は SAX 1.0とDOM level1をサポート

特徴
「Plugability」であること
JAXP 1.1で
Java API for XML Processingに変更され
XMLドキュメントをParsingするためのもの
から
XMLドキュメントをProcessing(処理)するためのもの
になっている
これは
XSLTのAPIが付け加わったため

JAXP1.0とJAXP 1.1の主な違い
* XSLT 1.0 のサポート
* SAX 2.0 のサポート
* DOM Level2 のサポート

JAXP 1.1の参照実装(Reference Implementation)は
デフォルトでは
SAX、DOMのパーサはSun MicrosystemsのProject Xから派生したCrimsonを使用し
XSLTエンジンはXalanを使用している


■JAXPの Plugability
アプリケーションからはJAXPのインターフェイスを介することによってパーサの実装を選択できる
ゆうこと

SAXやDOMの仕様に準拠しているパーサ(JAXP標準のパーサ, Xerces, Xalan等)ならば
抽象的なjavax.xml.parsersとjavax.xml.transform APIを通して使用できる

■SAX
(ref: http://megginson.com/SAX/)
JAXPでのSAXについて

SAXPaserインスタンス取得手順
1. SAXParserFactoryクラスのstaticメソッドのnewInstanceで SAXPaserFactoryインスタンスを獲得
2. SAXPaserFactoryインスタンスからSAXPaserを生成

SAXParserFactory=「plugability」を実現する部分

SAXParserFactory#newInstanceでは
↓のようにしてインスタンスを特定している
1. javax.xml.parsers.SAXParserFactory システムプロパティを使う
2. JRE ディレクトリ中のプロパティファイル lib/jaxp.propertiesを使う
このファイルの中に上記のシステムプロパティのキーと、バリューとなる SAX パーサの実装クラスを記述する
3. Service API を使う。Jar ファイル中のWEB-INF/services/javax.xml.parsers.parsers.SAXParserFactoryファイルに記述されているクラスを使う
4. デフォルトのSAXParserFactoryインスタンスを使用する


↓SAXParser作成サンプル

// SAXTest.java

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;

public class SAXTest {
public static void main (String[] args) {
// どの Factory インスタンスを使用するのかを表示
System.out.println(System.getProperty(
"javax.xml.parsers.SAXParserFactory"));

try {
// SAXParserFactory インスタンスを取得
SAXParserFactory factory =
SAXParserFactory.newInstance();

// デフォルトのイベントハンドラを作成
DefaultHandler handler = new MyHandler();

// SAXParser を取得
SAXParser parser = factory.newSAXParser();

// myHandler を用いて parse する
parser.parse(new InputSource(args[0]), handler);
}
catch (SAXException e) {
System.out.println("SAXException");
}
catch (IOException e) {
System.out.println("IOException");
}
catch (ParserConfigurationException e) {
System.out.println("ParserConfigurationException");
}
}
}

class MyHandler extends DefaultHandler {
public void startElement (String uri,
String name,
String qName,
Attributes atts) {
System.out.println("Start Element : " + name);
}

public void endElement (String uri,
String name,
String qName) {
System.out.println("End Element : " + name);
}
}

デフォルトのパーサの代わりにXercesのパーサを使用する場合
実行引数に指定すれば ソースに変更はない
java -Djavax.xml.parsers.SAXParserFactory=
org.apache.xerces.jaxp.SAXPaserFactoryImpl SAXTest xml_file


■DOM
(ref: http://www.w3.org/DOM/)
org.w3c.dom.Documentオブジェクトを得るために
DOMの実装をラップしたDocumentBuilderを使用する

DocumentBuilderインスタンス作成手順
1. DocumentBuilderFactoryクラスのstaticメソッドのnewInstanceでDocumentBuilderFactoryインスタンスを取得する
2. その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する

DocumentBuilderFactory#newInstanceは
以下順序でDocumentBuilderFactoryを決定する
1. javax.xml.parsers.DocumentBuilderFactoryシステムプロパティを使う
2. JRE ディレクトリ中のプロパティファイル lib/jaxp.properties
を使う
このファイルの中に上記のシステムプロパティのキーと バリューとなるDOM パーサの実装クラスを記述する
3. Service API を使う
Jar ファイル中のWEB-INF/services/javax.xml.parsers.parsers.DocumentBuilderFactoryファイルに記述されているクラスを使う
4. デフォルトのDocumentBuiderFactoryインスタンスを使用する

サンプル↓
// DOMTest.java

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;

public class DOMTest {
public static void main (String[] args) {
// どの Factory インスタンスを使用するのかを表示
System.out.println(System.getProperty(
"javax.xml.parsers.DocumentBuilderFactory"));

try {
// DocumentBuilderFactory インスタンスを取得
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();

// DocumentBuilder を取得
DocumentBuilder builder =
factory.newDocumentBuilder();

// DocumentBuilder を用いて Document オブジェクトを取得
Document doc =
builder.parse(new InputSource(args[0]));

// ルートノードのタグ名を表示
System.out.println(
doc.getDocumentElement().getTagName());
}
catch (SAXException e) {
System.out.println("SAXException");
}
catch (IOException e) {
System.out.println("IOException");
}
catch (ParserConfigurationException e) {
System.out.println(
"ParserConfigurationException");
}
}
}

システムプロパティにxercesのDOMパーサを指定すれば
xercesのDOMパーサを変更できる
java -Djavax.xml.parsers.DocumentBuilderFactory=
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl


■XSLT
(ref: http://www.w3.org/TR/1999/REC-xslt-19991116)
JAXPでXSLTを行うにはjavax.xml.transform.Transformerクラスを使う
SAXやDOMのと同様
TransformerFactoryクラスからTransformerインスタンスを取得する

1. TransformerFactoryクラスの static
メソッドのnewInstanceによってTransformerFactoryインスタンスを取得する
2. その獲得したTransformerFactoryインスタンスに XSLT が記述されたスタイルシートをセットする
3. そのスタイルシートをもとにしたTransformerインスタンスを取得する

XSLTもPlugabilityを確保する
TransformerFactoryクラスの
newInstanceメソッドは以下の順序でインスタンスを決定する

1. DocumentBuilderFactoryクラスのstaticメソッドのnewInstanceによってDocumentBuilderFactoryインスタンスを取得する
2. その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する

DocumentBuilderFactoryクラスのnewInstanceメソッドは以下の順序でDocumentBuilderFactoryを決定する。

1. javax.xml.transformer.TransformerFactoryシステムプロパティを使う
2. JREディレクトリ中のプロパティファイル lib/jaxp.properties
を使う。このファイルの中に上記のシステムプロパティのキーと、バリューとなる実装クラスを記述する
3. Service API を使う
Jar ファイル中の
WEB-INF/services/javax.xml.transformer.TransformerFactoryファイルに記述されているクラスを使う
4. デフォルトのDocumentBuilderFactoryインスタンスを使用する


サンプルコード
// XSLTTest.java

import java.io.*;
import java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

class XSLTTest {
public static void main(String args[]) {//第1引数はXSLTをかけたいXMLドキュメントで 第2引数はXSLTが記述されたスタイルシート
try {
// TransfomerFactory インスタンスの取得
TransformerFactory factory =
TransformerFactory.newInstance();

// XSL をセット
StreamSource xslsrc =
new StreamSource(new FileInputStream(args[1]));

// セットされた XSL から Transformar を取得
Transformer transformer =
factory.newTransformer(xslsrc);

// 出力のエンコーディングをシフト JIS にセット
transformer.setOutputProperties(new Properties() {
{
setProperty("encoding", "Shift_JIS");
}
});

// XSLT をかける XML をセット
StreamSource xmlsrc = new StreamSource(
new FileInputStream(args[0]));

// XSLT をかけ,出力を標準出力に
transformer.transform(
xmlsrc, new StreamResult(System.out));

}
catch (TransformerException e) {
System.out.println("TransformerException");
}
catch (IOException e) {
System.out.println("IOException");
}
}
}


ref:
Javaを紐解くための重点キーワード:JAXP
http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey04.html

tag : JAXP

2009-10-25 14:19 : __lang__xml : コメント : 0 : トラックバック : 0 :

JSON

JavaScript Object Notation
XMLなどと同様のテキストベースのデータフォーマット

XMLと比べると簡潔に構造化されたデータを記述できる。

4つのプリミティブ型(文字列、数字、真偽値、null)を持ち、
配列もしくはオブジェクトを構成要素にできる。
入れ子も可能で、文法はJavaScriptのサブセット。

Dynamic Script TagとJSONを利用して、
クロスドメインのデータ通信を行う手法をJSONP。
JSONPで読み込まれたJSONデータは
JavaScriptのオブジェクトツリーとしてWebアプリの空間上に展開される。
メモリ内に半構造データを展開し、
そのオブジェクトの木構造にプログラムからアクセスする
という点でDOMと類似した手法と言える。

JSONやDOMの利点は、
メモリ上に展開された木が更新可能で、
また任意の要素にアクセスするのが容易である点である。
欠点は、
処理を行うコンピュータが搭載しているメモリ量によって、
利用できるXML文書のサイズが制限されてしまう点である。
また、センサーデータなどのストリームデータも扱えない。


※SAX
XMLにおいては搭載メモリ量に左右されない処理手法としてSAXがある。
SAXは、
XML文書を先頭から走査し、要素開始、文字列、要素の終了などを
発見する度にイベントとしてユーザに通知する順次アクセス方の手法で、
読み込みと同時に処理を開始でき、
メモリ負担も低いのが特徴。

ref:
http://www.thinkit.co.jp/article/70/1/
http://www.thinkit.co.jp/article/116/1/2.html
2009-08-17 04:15 : __lang__xml : コメント : 0 : トラックバック : 0 :

Invalid byte 1 of 1-byte UTF-8 sequence

ビルドファイル中に日本語を入力するには、ファイルの最初に

のように使用する文字コードを指定せんと
デフォルトの UTF-8 コードであるとみなされて

BUILD FAILED
Error reading project file: invalid byte 1 of 1-byte UTF-8 sequence (0xb4)

のようなエラーメッセージが表示されるんだとさ。

UTF-8とShift_JISとISO-8859-1の違いは何なんかねー?

ref:
http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/using.html

tag : Invalid byte 1 of 1-byte UTF-8 sequence

2008-10-31 21:04 : __lang__xml : コメント : 0 : トラックバック : 0 :

XPath

XSLT
eXtensible Stylesheet Language Transformations
XMLテキストを表示・印刷用に変換するためのもの。
XSLの一部。
XML文書を他のXML文書やHTML文書に変換できる。

変換前XML文書―→XSLTプロセッサ→変換後XML文書
           ↑
       XSLTスタイルシート

XPath
XML Path Language
XML文書の一部分をアドレッシングするための言語。
→XSLで使われている、XMLテキストの構造を辿って、要素や属性、文字列を指し示す為の言語。

XSLTでXMLデータの構造変換を記述する為には、
XMLデータ中の特定の要素や属性を指定するための言語(=XPath)が必要。

XSLTのスタイルシートを作成するのに使用。


XPathの書き方
―XMLデータ―
<'?xml version="1.0"?>
<'publications>
<'book>HogeBook<'/book>
<'book>HogeBook<'/book>
<'magazine>HogeMagazine<'/magazine>
<'/publications>

XPathのデータモデルによるツリー構造―
ルートノード

|―要素ノード/publication
  |
  |―要素ノード/book
  | |―テキストノード/HogeBook
  |
  |―要素ノード/book
  | |―テキストノード/HogeBook
  |
  |―要素ノード/magazine
    |―テキストノード/HogeMagazine

XPath文法/ルートノードは、記号[/]で指定する。
<'xsl:template match="/">
……
<'/template>
→ルートノードにテンプレートを適用させる、ゆう意味。

XPath文法/親子関係は、[/]で表す。
ノード同士の親子関係(階層構造)は、記号[/]で親要素・子要素を連結してい表現する。
<'xsl:template match="publications/book">
……
<'/xsl:template>
→publication要素の子要素bookにテンプレートを適用させる、ゆう意味。

□XPath文法/祖先と子孫は[//]で連結する。
ある要素の子孫要素にテンプレートルールを適用したい場合、
記号[//]で祖先要素と子孫要素を連結して表現する。
<'xsl:template match="publications//price">
……
<'/xsl:template>
→publication要素の子要素{book}の子要素priceにテンプレートルールを適用させる、ゆう意味。

□XPath文法/test()でテキストノードを取り出す。
XML1.0文法では、開始タグと終了タグで囲まれた部分を要素の内容という。
<'book>HogeBook<'/book>
XPathでは、要素の内容は、その要素ノードに繋がるテキストノードであると考える。
XPathで、ある要素の子テキストノードを明示的に選択するには、text()を用いる。
<'xsl:value-of select="book/text()"/>
cf.
<'xsl:valu-of select="book"/>と書いても、XSLTプロセッサは、
book要素の値として子テキストノードの文字列を返すので、結果は同じ。

□XPath文法/カレントノードは[.]で表す。
XSLTプロセッサが現在処理しているノードをカレントノードという。
XPathでは、[.]で表現する。
<'xsl:value-of select".">
→カレントノードの子テキストノードを取り出す、ゆう意味。

XPathのデータモデルでは、要素内で指定された属性をノードの一種と考え、属性ノードと呼ぶ。
属性ノードとその属性を持つ要素ノードの関係は、従属関係にあり、要素ノードの親子関係とは別。

属性ノードの他にも、
名前空間ノード、処理命令ノード、コメントノードがある。

■XPathの演算子
比較演算子: =, !=, <', >, <'=, >=
算術演算子: +, -, *, div, mod
論理演算子: and, or

※比較演算子[<']と[>]は、XMLではタグの開始と終了を示すため、
 XPathで使用する際は、エンティティ参照(実態参照)の[<]と[>]を使用して置換すること。

■XPathのノード集合関数
XPathには、ノード集合関数、文字列関数、ブール関数、数値関数が用意されている。
ex
・position() →指定されたノード集合の中のそれぞれの位置を返す。
・last() →指定されたノード集合の最後のノードの位置を返す。
・count() →指定されたノード集合のサイズを返す。
上記の関数で、同一階層で同一要素名を持つものの中から特定の要素だけを指定できる。
<'xsl:template match="book[position()=2]"/>
→複数羅列しているbook要素の中から2番目のbook要素だけを処理する、ゆう意味。

■XPathでの特定属性の選択
要素が持つ属性に注目し、特定の属性値を持つノードだけを選択できる。
<'?xml version="1.0" encoding="shift_jis"?>
<'publications>
<'book att="XML">ほげ<'/book>
<'book att="SGML">ホゲ<'/book>
<'book att="DTP">歩夏<'/book>
<'/publications>
属性名の前に[@]を付ける事で、属性値をXPathの中で参照できる。
<'xsl:template match="book[@att='SGML']"/>
→att属性が"SGML"の要素(2番目のbook要素のみ)を選択する、ゆう意味。


ref:
XPathの書き方の基本
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt02.html
W3C/XSLT
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm
W3C/XPath
http://www.doraneko.org/xml/xpath10/19991116/Overview.html

tag : XSLT XML XPath XSL eXtensible Stylesheet Language Transformations

2008-08-30 01:42 : __lang__xml : コメント : 0 : トラックバック : 0 :

XSLT

XML関連のW3C勧告規格
異なるデータフォーマット(スキーマ)を使ったデータ間で
データ交換する場合にXSLTXMLデータの構造変換して対応

XMLはデータの論理的な構造を記述するための言語
よって、XML文書には、Webブラウザや紙面に表示する体勢を示すレイアウト情報(スタイル情報)がない。

だから、XMLデータを表示するには、以下の処理が必要になる。
 ①XMLデータの構造を、(Webブラウザ等の)フォーマッタが受け付けるオブジェクトへと、構造変換する処理
 ②(文字の大小や色等)スタイル付けする処理

①のXMLデータの構造変換を指定する部分を、独立した規格として取り出したのがXSLT
XSLTには、変数や関数、繰り返しや条件付処理等のプログラミング機能が盛り込まれおり、
複雑なデータ変換処理も対応できる。

XMLデータから以下へのデータ構造変換が可能
・XMLデータ
・HTMLデータ
・非XMLデータ(テキスト、CSV)


XSLTによる変換処理の記述は、スタイルシートと呼ばれている。
XSLTスタイルシートの記述に従い、XSLTプロセッサがXMLデータの構造変換をする

※CSS(cascading style sheet) ≠ XSLT

■基本的書き方
・XSLTスタイルシート自体はXMLタグで書く。
・XSLTの名前空間に属する要素を、XSLTの命令として使用する。

□XSLTの名前空間
 ・xsl:stylesheet
 ・xsl:template
 ・xsl:value-of
 ・xsl:apply-tempates

□XML宣言
 スタイルシートの冒頭にXML宣言を書く。
 <'?xml version="1.0" encoding="shift_jis"?>

□XSLT宣言[xsl:stylesheet]
 スタイルシート全体を囲むタグ。
 この命令で、XSLTのバージョンとXSLTの名前空間の宣言をする。
 
 <'xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  ……
 <'/xsl:stylesheet>
 version属性でバージョン指定。
 xmlns:xsl属性で名前空間指定。

□テンプレートの指定[xsl:template]
 XMLデータの構造変換の記述とは、
  ①与えられたXMLデータのノードを変換元とするのか
  ②変換先のXMLデータに、どんなノードを生成・付加するのか
 を指定すること。
 この指定を[xsl:template]要素で表現する。
 
 <'xsl:template match=変換元を指定するパターン >
  ……変換先で生成されるXML構造のテンプレート……
 <'/xsl:template>
 ①の指定は、patterと呼ばれ、match属性で指定する。(ノードの指定はXPah文法に従う)
 ②の指定は、templateと呼ばれ、xsl:templateタグで挟まれた部分にXML構造として表現する。
 
 <'xsl:template match="paragraph" >
  <'p><'/p>
 <'/xsl:template>
 変換元のXMLデータのparagraph要素に対して、HTMLのp要素を生成する、ゆう意味。

□文字列コピー[xsl:value-of]
 文字列のコピーに[xsl:value-to]要素を使う。
 
 <'xsl:template match="paragraph" >
  <'p><'xsl:value-of select="." /><'/p>
 <'/xsl:template>
 select属性の"."は、現在の要素の文字列値、ゆう意味。
 
 <'xsl:template match="title" >
  <'h1><'xsl:value-of select="." /><'/h1>
 <'/xsl:template>
 変換元XMLデータのtitle要素出現で変換先のXMLデータのh1要素を生成・付加する、ゆう意味。

□構造のコントロール[xsl:apply-tempates]
 XMLは、要素の階層でデータが表現されている。
 テンプレートルールは、変換元のXMLデータの要素毎に個別に指定するが、
 変換先となるXMLデータ(HTMLデータ等)にも構造を持たせんといけん。
 変換先の構造を管理するのが、[xsl:apply-templates]要素。
 
 <'xsl:template match="article" >
  <'html><'xsl:apply-templates /><'/html>
 <'/xsl:template>
 article要素に対してhtml要素を生成させる。
 xsl:apply-templatesは、article要素の子要素であるtitle要素、
 paragraph要素を別の場所にあるxsl:template要素で変換先へマッピングさせた結果を
 <'html><'/html>間に埋めこと、ゆう意味。
 
□ルートノード
 match属性の値に書く"/"はルートノードを意味する。
 <'xsl:template match="/" >
  <'xsl:apply-templates />
 <'/xsl:template>

□ex
―xml―
<'?xml version="1.0" encoding="Shift_JIS" ?>
<'?xml-stylesheet href="article-view.xsl" type="text/xsl" ?>
<'article>
 <'title>XSLT INTRO<'/title>
 <'paragraph>TO UNDERSTAND XSLT<'/paragraph>
<'/article>
―xslt―
<'?xml version="1.0" encoding="shift_jis" ?>
<'xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <'xsl:template match="/">
  <'xsl:apply-templates/>
 <'/xsl:template>
 <'xsl:template match="article">
  <'html><'xsl:apply-templates/><'/html>
 <'/xsl:template>
 <'xsl:template match="title">
  <'h1><'xsl:value-of select="."/><'/h1>
 <'/xsl:template>
 <'xsl:template match="paragraph" >
  <'p><'xsl:value-of select="."/><'/p>
 <'/xsl:template>
<'/xsl:stylesheet>


ref:
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt01.html

tag : XSLT XML

2008-08-29 01:49 : __lang__xml : コメント : 0 : トラックバック : 0 :

XSD:独自データ型

□ゴール
<'order>
<'orderItem>
<'id>4-8443-1780-6<'/id>
<'quantity>3<'/quantity>
<'/orderItem>
<'/order>
 -id要素:
   [数字1個]+[-]+[数字4個]+[-]+[数字4個]+[-][数字1個]形式の表品番号

□作成
<'xsd:simpleType name="idType">-①
<'xsd:restriction base="xsd:string">-②
<'xsd:pattern value="d{1}-d{4}-d{4}-d{1}"/>-③
<'/xsd:restriction>-④
<'/xsd:simpleType>-⑤

 ①:新規データ型の宣言[xsd:simpleType]
   既存のデータ型(simpleType)に一定の制限を加えて新しいデータ型を作成する。
 ②:制限指定[xsd:restriction]
   ベースとなるデータ型を指定する。
 ③:形式指定(pattern要素)
   形式を正規表現で指定する。
 ④:終了タグ
 ⑤:終了タグ
 
□使用
1 :<'?xml version="1.0"?>
2 :<'xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3 :
4 : <'xsd:element name="order">
5 : <'xsd:complexType>
6 : <'xsd:sequence>
7 : <'xsd:element ref="orderItem" maxOccurs="10"/>
8 : <'/xsd:sequence>
9 : <'/xsd:complexType>
10: <'/xsd:element>
11:
12: <'xsd:element name="orderItem">
13: <'xsd:complexType>
14: <'xsd:sequence>
15: <'xsd:element name="id" type="idType"/>
16: <'xsd:element name="quantity" type="xsd:integer"/>
17: <'/xsd:sequence>
18: <'/xsd:complexType>
19: <'/xsd:element>
20:
21: <'xsd:simpleType name="idType">
22: <'xsd:restriction base="xsd:string">
23: <'xsd:pattern value="d{1}-d{4}-d{4}-d{1}"/>
24: <'/xsd:restriction>
25: <'/xsd:simpleType>
26:
27:<'/xsd:schema>

□作成2
 セレクトボックス的なやつ
 
<'xsd:simpleType name="idType">-①
<'xsd:restriction base="xsd:string">-②
<'xsd:enumeration value="4-8443-1780-6"/>-③
<'xsd:enumeration value="4-7741-1751-1"/>
<'xsd:enumeration value="4-7741-1684-1"/>
<'/xsd:restriction>
<'/xsd:simpleType>

 ②[xsd:enumeration]:指定可能な要素の指定

□作成3
 範囲付き数値

<'xsd:simpleType name="quantityType">
<'xsd:restriction base="xsd:integer">
<'xsd:minInclusive value="1"/>
<'xsd:maxInclusive value="10"/>
<'/xsd:restriction>
<'/xsd:simpleType>

□範囲指定の属性
 -min/maxInclusive:
  境界値含む加減/上限(min<'=x<'=max)
 -min/maxExclusive:
  境界値含まない加減/上限(min<'x<'max)

■エトセトラなオプション
-[use属性]必須性
 ・required:必須属性
 ・optional:任意属性
 ・prohibited:禁止属性
 -ex
  <'xsd:attribute name="id" type="idType" use="required"/>

-[default属性]デフォルト値
 -ex
  <'xsd:attribute name="quantity" type="xsd:integer" default="1"/>

-[xsd:attributeGroup要素]属性のグループ化

1 : <'xsd:element name="orderItem">
2 : <'xsd:complexType>
3 : <'xsd:sequence><'/xsd:sequence>
4 : <'xsd:attributeGroup ref="orderItemAttributes"/>
5 : <'/xsd:complexType>
6 : <'/xsd:element>
7 :
8 : <'xsd:attributeGroup name="orderItemAttributes">
9 : <'xsd:attribute name="id" type="idType" use="required"/>
10: <'xsd:attribute name="quantity" type="xsd:integer" default="1"/>
11: <'/xsd:attributeGroup>

ref:
http://www.atmarkit.co.jp/fxml/rensai2/schema06/schema06_1.html

tag : xml xsd schema

2008-08-26 00:48 : __lang__xml : コメント : 0 : トラックバック : 0 :

XSD:基本データ型

boolean:真偽
     true、false、1、0
base64Binary:Base64エンコードされたバイナリ値
       GpM7
hexBinary:16進数
      0FB7
float:単精度32ビット浮動小数
    -INF、-1E4、-0、0、12.78E-2、12、INF、NaN
double:倍精度64ビット浮動小数
    -INF、-1E4、-0、0、12.78E-2、12、INF、NaN
decimal:10進数
     -1.23、0、123.4、1000.00
integer:整数
     -126789、-1、0、1、126789
nonPositiveInteger:0以下の整数
          -126789、-1、0
negativeInteger:0未満の整数
         -126789、-1
long:-9223372036854775808から9223372036854775807までの整数
   -1、12678967543233
int:-2147483648から2147483647までの整数
   -1、126789675
short:-32768から32767までの整数
    -1、12678
byte:-128から127までの整数
   -1、126
nonNegativeInteger:0以上の整数
          0、1、126789
unsignedLong:0から18446744073709551615までの整数
       0、12678967543233
unsignedInt:0から4294967295までの整数
       0、1267896754
unsignedShort:0から65535までの整数
        0、12678
unsignedByte:0から255までの整数
       0、126
positiveInteger:1以上の整数
         1、126789

duration:ある一定の期間
     P1Y2M3DT10H30M12.3S(1年2カ月3日10時間30分12.3秒)
dateTime:特定の日時
     1999-05-31T13:20:00.000-05:00(世界時間(UTC)から5時間遅れの東部標準時における1999年5月31日午後1時20分)
time:時刻
   13:20:00.000-05:00(世界時間(UTC)から5時間遅れの東部標準時における午後1時20分)
date:日付
   1999-05-31(1999年5月31日)
gYearMonth:グレゴリアン暦の年月
      1999-02(1999年2月)
gYear:グレゴリアン暦の年
    1999(1999年)
gMonthDay:グレゴリアン暦の月日
      --05-31(5月31日)
gMonth:グレゴリアン暦の月
    --05--(5月)
gDay:グレゴリアン暦の日
   ---31(31日)

string:文字列
    Confirm this is electric.Again ,confirm it.
normalizedString:改行文字、タブ文字を含まない文字列
         Confirm this is electric
token:改行、先頭・末尾の空白、および2つ以上連続した空白を含まない文字列
    Confirm this is electric
language:xml:lang属性の値として有効なもの(XML 1.0で定義されている)
     en-GB、en-US、fr
Name:XML 1.0 Name型。要素や属性の名前に使用可能な形式の文字列で、先頭と2文字目以降に使用できる文字が規定された文字列。
   shipTo
QName:XML Namespace のQName。名前空間URIとローカル名の組からなる。
    po:USAddress
NCName:XML Namespaceの NCName。QNameより接頭辞とコロンを取り除いたもの。
    USAddress
anyURI:URIの形式をした文字列
    http ://www.example.com/doc.html#ID5

ID:DTDのID型
IDREF:DTDのIDREF型
IDREFS:DTDのIDREFS型
ENTITY:DTDのENTITY型
ENTITIES:DTDのENTITIES型
NMTOKEN:DTDのNMTOKEN型
NMTOKENS:DTDのNMTOKENS型
NOTATION:DTDのNOTATION型

ref:
http://www.atmarkit.co.jp/fxml/rensai2/schema04/schema04.html
http://www.w3.org/TR/xmlschema-2/#built-in-datatypes

tag : xml schema xsd

2008-08-26 00:45 : __lang__xml : コメント : 0 : トラックバック : 0 :

INTRO TO XSD

XML Schema
 スキーマ言語
 どの要素がどの属性を持てるか 等のXMLの木構造のルール定義
 をする言語
 
 XML文書を解析しデータを読み取るプログラムがXMLパーサ
 必要なデータがXML文書に含まれているか確認するのもXMLパーサ
 
 DTD(Document Type Definition)もXMLのスキーマ言語
 古くてシンプル
 機能不足となったDTDに代わって登場したのがXML Schema
 
 要素の内容を指定の文字列に限定
 要素数の限定
 等細部まで指定可能

■単純Schema
<'greeting>Hello World!!<'/greeting>
 -ルート要素は greeting
 -greeting要素は属性を持たない
 -greeting要素の内容は文字列
 -greeting要素は子要素を持たない
 ↓
<'?xml version="1.0"?>-①
<'xsd:schema xmlns:xsd=""http ://www.w3.org/2001/XMLSchema">-②
 <'xsd:element name="greeting" type="xsd:string"/>-③
<'/xsd:schema>-④
 ①:XML宣言
 ②:ルート要素[xsd:schema]
   xsd:XML Schemaの名前空間(名前空間先頭辞)
   xsd:schema: XML Schemaのschema要素
   xmlns: 名前空間宣言の開始
   http...: 識別子(名前空間URI)
   xmlns:xsd="..": 名前空間宣言
   要素名の先頭にxsd:とあったら http...XMLSchemaで定義された要素であることを示す。
 ③:要素要素[element]
   xsd: 名前空間接頭辞
   name: 要素名を指定する属性
   greeting: 要素名
   type: 要素の構造を指定する属性
   xsd:string: 子供要素・属性なしで内容はXMLSchemaで定義しているstring型(文字列)
 ④:schema要素の終了タグ

■入れ子Schema
<'customer>
<'name>ほげ子<'/name>
<'address>東京都<'/address>
<'/customer>
 -customer要素:
   ・ルート要素
   ・属性無し
   ・子要素はnameとaddress
   ・子要素出現順序はnameの後にaddress
 -name/address要素:
   ・子要素なし
   ・属性なし
   ・内容は文字列

1 : <'?xml version="1.0"?>
2 : <'xsd:schema xmlns:xsd=""http ://www.w3.org/2001/XMLSchema">
3 : <'xsd:element name="customer">
4 : <'xsd:complexType>
5 : <'xsd:sequence>
6 : <'xsd:element name="name" type="xsd:string"/><'!--子要素①-->
7 : <'xsd:element name="address" type="xsd:string" /><'!--子要素②-->
8 : <'/xsd:sequence>
9 : <'/xsd:complexType>
10: <'/xsd:element>
11: <'/xsd:schema>

■単純型&複雑型
 要素が子要素・属性を持つかを判定するデータ型。
 -複雑型:
  子要素または属性を持つ要素のデータ型
 -単純型:
  子要素および属性を持たない要素のデータ型
  あるいは属性値のデータ型

 要素は複雑型か単純型かによって、宣言方法が異なる。

□複雑型
 L3: name属性の値には 要素名「customer」を指定。
 L4: 複雑型の要素を宣言する際のデータ型[xsd:complexType]
 L5: 子要素の出現順序の指定[xsd:sequence]
   name、addressの順番で宣言することを指定。
 L6: 子要素の宣言[xsd:element]
  単純型なので 普通にtype属性指定して終わり。
  複雑型の場合は 下層に[xsd:complexType]で続ける。
 
■ref属性で要素参照
 [xsd:element ref="要素名"]で参照可能。
1 : <'?xml version="1.0"?>
2 : <'xsd:schema xmlns:xsd=""http ://www.w3.org/2001/XMLSchema">
3 :
4 : <'xsd:element name="customer">
5 : <'xsd:complexType>
6 : <'xsd:sequence>
7 : <'xsd:element name="name" type="xsd:string"/>
8 : <'!-- address 要素に子要素を追加する -->
9 : <'xsd:element name="address">
10: <'xsd:complexType>
11: <'xsd:sequence>
12: <'xsd:element name="prefecture" type="xsd:string"/>
13: <'xsd:element name="city" type="xsd:string" />
14: <'xsd:element name="street" type="xsd:string" />
15: <'/xsd:sequence>
16: <'/xsd:complexType>
17: <'/xsd:element>
18: <'!-- ここまで -->
19: <'/xsd:sequence>
20: <'/xsd:complexType>
21: <'/xsd:element>
22:
23:<'/xsd:schema>

上と下は同じこと。

1 : <'?xml version="1.0"?>
2 : <'xsd:schema xmlns:xsd=""http ://www.w3.org/2001/XMLSchema">
3 :
4 : <'xsd:element name="customer">
5 : <'xsd:complexType>
6 : <'xsd:sequence>
7 : <'xsd:element name="name" type="xsd:string"/>
8 : <'xsd:element ref="address"/>
9 : <'/xsd:sequence>
10: <'/xsd:complexType>
11: <'/xsd:element>
12:
13: <'xsd:element name="address">
14: <'xsd:complexType>
15: <'xsd:sequence>
16: <'xsd:element name="prefecture" type="xsd:string"/>
17: <'xsd:element name="city" type="xsd:string" />
18: <'xsd:element name="street" type="xsd:string" />
19: <'/xsd:sequence>
20: <'/xsd:complexType>
21: <'/xsd:element>
22:
23: <'/xsd:schema>

■要素属性の宣言
 [xsd:attribute]で要素属性を指定。

<'customer hoge="hogege" piyo="piyoyo">
<'name>ほげ子<'/name>
<'address>東京都<'/address>
<'/customer>
 -customer要素
   ・ルート要素
   ・hoge属性、piyo属性あり
   ・子要素はnameとaddress
   ・子要素出現順序はnameの後にaddress
 ↓
1: <'?xml version="1.0"?>
2: <'xsd:schema xmlns:xsd=""http ://www.w3.org/2001/XMLSchema">
3:
4: <'xsd:element name="customer">
5: <'xsd:complexType>
6: <'xsd:sequence>
7: <'xsd:element name="name" type="xsd:string"/>
8: <'xsd:element name="address" type="xsd:string" />
9: <'/xsd:sequence>
10: <'!-- 属性を追加する -->
11: <'xsd:attribute name="hoge" type="xsd:string"/>
12: <'xsd:attribute name="piyo" type="xsd:string"/>
13: <'/xsd:complexType>
14: <'/xsd:element>
15:
16: <'/xsd:schema>

■maxOccurs属性
 繰り返し出現する要素の最多出現数を指定する属性
<'order>
<'orderItem>こども①<'/orderItem>
<'orderItem>こども②<'/orderItem>
<'/order>
 -order要素:
   ・複雑型
   ・ルート要素
   ・複数出現する子要素あり(10個以下)
 -orderItem要素:
   ・単純型
   ・内容は文字列
 ↓
1 :<'?xml version="1.0"?>
2 :<'xsd:schema xmlns:xsd="http ://www.w3.org/2001/XMLSchema">
3 :
4 : <'xsd:element name="order">
5 : <'xsd:complexType>
6 : <'xsd:sequence>
7 : <'xsd:element name="orderItem" type="xsd:string" maxOccurs="10"/>
8 : <'/xsd:sequence>
9 : <'/xsd:complexType>
10: <'/xsd:element>
11:
12:<'/xsd:schema>

 ※[maxOccurs="unbounded"]=1個以上の上限無し

■minOccurs属性
 繰り返し出現する要素の最少出現数を指定する属性
 0以上を指定可能

■choice要素
 いずれかを選択させる属性

1 :<'?xml version="1.0"?>
2 :<'xsd:schema xmlns:xsd="http ://www.w3.org/2001/XMLSchema">
3 :
4 : <'xsd:element name="order">
5 : <'xsd:complexType>
6 : <'xsd:sequence>
7 : <'xsd:element ref="orderItem" maxOccurs="10"/>
8 : <'/xsd:sequence>
9 : <'/xsd:complexType>
10: <'/xsd:element>
11:
12: <'xsd:element name="orderItem">
13: <'xsd:complexType>
14: <'xsd:sequence>
15: <'xsd:choice>
16: <'xsd:element name="name" type="xsd:string"/>
17: <'xsd:element name="id" type="xsd:string"/>
18: <'/xsd:choice>
19: <'xsd:element name="quantity" type="xsd:string" minOccurs="0"/>
20: <'/xsd:sequence>
21: <'/xsd:complexType>
22: <'/xsd:element>
23:
24:<'/xsd:schema>

ref:
http ://www.atmarkit.co.jp/fxml/rensai2/schema01/schema01.html

tag : XML Schema xsd

2008-08-26 00:42 : __lang__xml : コメント : 0 : トラックバック : 0 :

namespace definition

==problem==
<'?xml version="1.0" encoding="UTF-8"?>
<'ResBean xmlns="http: //hoge/sample/response">
<'ns1:userId xmlns:ns1="http: //hoge/sample/request">hoge<'/ns1:userId>
<'ns2:userName xmlns:ns2="http: //hoge/sample/request">piyo<'/ns2:userName>
<'/ResBean>

==solution==
change the line 2
------------
1: <'?xml version="1.0" encoding="UTF-8"?>
2: <'mapping xmlns="http: //hoge/sample/request">
3: <'class name="hoge.bean.ResBean">
4: <'map-to xml="ResBean" ns-uri="http: //hoge/sample/response"/>
5:
6: <'field name="userId" type="java.lang.String">
7: <'bind-xml name="userId" node="element"/>
8: <'/field>
9:
10: <'field name="userName" type="java.lang.String">
11: <'bind-xml name="userName" node="element"/>
12: <'/field>
13:
14: <'/class>
15: <'/mapping>
------------
into
------------
1: <'?xml version="1.0" encoding="UTF-8"?>
2: <'mapping xmlns="http: //hoge/sample/response">
3: <'class name="hoge.bean.ResBean">
4: <'map-to xml="ResBean" ns-uri="http: //hoge/sample/response"/>
5:
6: <'field name="userId" type="java.lang.String">
7: <'bind-xml name="userId" node="element"/>
8: <'/field>
9:
10: <'field name="userName" type="java.lang.String">
11: <'bind-xml name="userName" node="element"/>
12: <'/field>
13:
14: <'/class>
15: <'/mapping>
------------


==result==
<'?xml version="1.0" encoding="UTF-8"?>
<'ResBean xmlns="http: //hoge/sample/response">
<'userId>hoge<'/userId>
<'userName>piyo<'/userName>
<'/ResBean>
2008-01-20 23:15 : __lang__xml : コメント : 0 : トラックバック : 0 :
ホーム

search

ad



counter


tag cloud

category cloud