XML
日本語 | 拡張可能印言語 |
英語 | eXtensible Markup Language |
ふりがな | えっくすえむえる |
フリガナ | エックスエムエル |
データの格納形式のひとつ。
主にファイルに保存する際に使用される形式。実際には普通のテキストファイル。多くの場合、拡張子は.xmlとなっている。文字コードは問わない。
「タグ」と呼ばれる「<」と「>」で囲まれた文字列でデータを囲み、このタグによってデータを管理する。
たとえば、以下のようなテキストがXMLファイルには格納されている。
<?xml version="1.0" encoding="Windows-31J"?>
<test_xml>
<test>テストです</test>
</test_xml>
このXMLには「test_xmlにはtestデータがあり、そのtestデータに格納された値は『テストです』である」ということが記述されている。
XMLはただのテキスト形式のため扱いが簡単というメリットがある。また、タグによるデータの管理は、同じテキスト形式のCSV等に比べて分かりやすいというメリットがある。
また、XMLには「XMLの形式が正しいかどうか」をチェックする機能がある。上記の例のXMLでは「test_xmlの中にtest」があることが決まっている。こういった各XMLごとのルールを定義することができ、それを元にXMLの内容が正しいかどうか確認することができる。
XMLはWebアプリケーションの「共通フォーマット」としてデファクトスタンダートとなりつつある。
たとえばRSSはXMLとして出力されるし、Amazon Web サービスの出力結果もXML形式である。
これら、Webアプリケーションの共通フォーマットとしてXMLが使用されている。XMLであればXML用ライブラリで同じように処理できるため、Webアプリケーション同士が相互に利用しやすくなる。
これらのメリットにより、XMLは急速に普及しつつある。
JavaでXMLを扱う場合、DOMやSAX、Xercesといった各種ライブラリを使用する。ただし、これらXML用ライブラリにはクセのあるものが多い。
XML用ライブラリは数が多いため、自分にあった、またプログラムにあったライブラリを探してみるのもいいだろう。
また「特定のXML形式用ライブラリ」も存在するため、出力するXMLが一般に広まっている場合には専用のライブラリを探すのもいい。たとえば、RSS用にはRss4jといったライブラリが存在する。
主にファイルに保存する際に使用される形式。実際には普通のテキストファイル。多くの場合、拡張子は.xmlとなっている。文字コードは問わない。
「タグ」と呼ばれる「<」と「>」で囲まれた文字列でデータを囲み、このタグによってデータを管理する。
たとえば、以下のようなテキストがXMLファイルには格納されている。
<?xml version="1.0" encoding="Windows-31J"?>
<test_xml>
<test>テストです</test>
</test_xml>
このXMLには「test_xmlにはtestデータがあり、そのtestデータに格納された値は『テストです』である」ということが記述されている。
XMLはただのテキスト形式のため扱いが簡単というメリットがある。また、タグによるデータの管理は、同じテキスト形式のCSV等に比べて分かりやすいというメリットがある。
また、XMLには「XMLの形式が正しいかどうか」をチェックする機能がある。上記の例のXMLでは「test_xmlの中にtest」があることが決まっている。こういった各XMLごとのルールを定義することができ、それを元にXMLの内容が正しいかどうか確認することができる。
XMLはWebアプリケーションの「共通フォーマット」としてデファクトスタンダートとなりつつある。
たとえばRSSはXMLとして出力されるし、Amazon Web サービスの出力結果もXML形式である。
これら、Webアプリケーションの共通フォーマットとしてXMLが使用されている。XMLであればXML用ライブラリで同じように処理できるため、Webアプリケーション同士が相互に利用しやすくなる。
これらのメリットにより、XMLは急速に普及しつつある。
JavaでXMLを扱う場合、DOMやSAX、Xercesといった各種ライブラリを使用する。ただし、これらXML用ライブラリにはクセのあるものが多い。
XML用ライブラリは数が多いため、自分にあった、またプログラムにあったライブラリを探してみるのもいいだろう。
また「特定のXML形式用ライブラリ」も存在するため、出力するXMLが一般に広まっている場合には専用のライブラリを探すのもいい。たとえば、RSS用にはRss4jといったライブラリが存在する。
// Sample.java
import java.io.StringWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Sample
{
public static void main( String[] args )
{
// DOMを使用して、XMLのパーシングを行います。
ByteArrayInputStream byteArrayInputStream = null;
StringWriter stringWriter = null;
try
{
/** XMLの文字コードです。 */
String XML_TEXT_ENCODE = "UTF-8";
/** XMLの基本部分です。 */
String XML_TEXT_HEADER
= "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<test_xml>\n"
+ " <test>テストです</test>\n"
+ "</test_xml>\n"
;
// この文字列を、UTF-8形式のbyte型配列として取り出します。
byte[] bytes = XML_TEXT_HEADER.getBytes( XML_TEXT_ENCODE );
// そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// パーサーを作ります。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// パーシングします。
Document document = documentBuilder.parse( byteArrayInputStream );
// ここまででパーシングが完了しました。
// 次はXMLを修正します。
// ルートエレメント、つまり<test_xml>タグを指すエレメントを取得します。
Element root = document.getDocumentElement();
System.out.println( "ルートエレメントの名前:" + root.getTagName() );
// ルートエレメントの名前:test_xml
// ルートエレメントの下にあるノードをノードリストとして取得します。
NodeList testsNodeList = root.getElementsByTagName( "test" );
// 0番目の要素をノードとして取得します。
Node testNode = testsNodeList.item( 0 );
if( testNode.getNodeType() == Node.ELEMENT_NODE )
{
// このノードは「エレメント」です。
System.out.println( "testNode.getNodeValue():このノードは「エレメント」です。" );
// testNode.getNodeValue():このノードは「エレメント」です。
}
// なのでElementインターフェイスにキャストできます。
Element testElement = (Element)testNode;
System.out.println( "ルートエレメントの子エレメントの名前:" + testElement.getTagName() );
// ルートエレメントの子エレメントの名前:test
// <test>タグエレメントの子ノードを取得します。
NodeList testValuesNodeList = testElement.getChildNodes();
// 0番目の要素をノードとして取得します。
Node testValueNode = testValuesNodeList.item( 0 );
if( testValueNode.getNodeType() == Node.TEXT_NODE )
{
// このノードは「テキスト」です。
System.out.println( "testValueNode.getNodeValue():このノードは「テキスト」です。" );
// testValueNode.getNodeValue():このノードは「テキスト」です。
}
// このテキストに当たる文字列を取得します。
String testValue = testValueNode.getNodeValue();
System.out.println( "<test>タグ内の文字列:" + testValue );
// <test>タグ内の文字列:テストです
// <test>タグエレメントにtest属性を加えます。
testElement.setAttribute( "test", "value" );
// エレメントを新規作成してルートエレメントに追加します。
Element element = document.createElement( "test1" );
element.appendChild( document.createTextNode( "テストです" ) );
root.appendChild( element );
// もうひとつ追加します。
element = document.createElement( "test2" );
element.appendChild( document.createTextNode( "テストですって" ) );
root.appendChild( element );
// ここまででXMLの修正が完了しました。
// 最後に出力します。
// StringWriterクラスを通して文字列に出力します。
stringWriter = new StringWriter();
// そのStringWriterクラスをStreamResultクラスに渡して
// 「出力対象」にします。
StreamResult streamResult = new StreamResult( stringWriter );
// XMLドキュメントをDOMSourceクラスに渡して「入力対象」にします。
DOMSource domSource = new DOMSource( document );
// 出力用のTransformer実装クラスを作ります。
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 指定した「入力対象」から「出力対象」へと出力します。
transformer.transform( domSource, streamResult );
// とりあえず出力。
System.out.println( stringWriter.toString() );
// <?xml version="1.0" encoding="UTF-8"?>
// <test_xml>
// <test test="value">テストです</test>
// <test1>テストです</test1><test2>テストですって</test2></test_xml>
// このようにXMLを作成することができます。
// 実際にはこのあとファイルに出力したりサーブレットから
// 返したりします。
}
catch( UnsupportedEncodingException e )
{
// StringクラスのgetBytes()メソッドで、存在しない文字コードを
// 指定された場合にこの例外が投げられます。
e.printStackTrace();
}
catch( TransformerConfigurationException e )
{
// TransformerFactoryクラスのnewTransformer()メソッドの
// 呼び出し中に失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( TransformerException e )
{
// TransformerFactoryクラスのtransform()メソッドで
// 出力に失敗した場合にこの例外が投げられます。
e.printStackTrace();
}
catch( ParserConfigurationException e )
{
// DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
// 呼び出し中に失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( SAXException e )
{
// DocumentBuilderクラスのparse()メソッドの呼び出しで
// パーシングに失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( IOException e )
{
// DocumentBuilderクラスのparse()メソッドの呼び出しで
// パーシングに失敗するとこの例外が投げられます。
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( stringWriter != null )
{
stringWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.StringWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Sample
{
public static void main( String[] args )
{
// DOMを使用して、XMLのパーシングを行います。
ByteArrayInputStream byteArrayInputStream = null;
StringWriter stringWriter = null;
try
{
/** XMLの文字コードです。 */
String XML_TEXT_ENCODE = "UTF-8";
/** XMLの基本部分です。 */
String XML_TEXT_HEADER
= "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<test_xml>\n"
+ " <test>テストです</test>\n"
+ "</test_xml>\n"
;
// この文字列を、UTF-8形式のbyte型配列として取り出します。
byte[] bytes = XML_TEXT_HEADER.getBytes( XML_TEXT_ENCODE );
// そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// パーサーを作ります。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// パーシングします。
Document document = documentBuilder.parse( byteArrayInputStream );
// ここまででパーシングが完了しました。
// 次はXMLを修正します。
// ルートエレメント、つまり<test_xml>タグを指すエレメントを取得します。
Element root = document.getDocumentElement();
System.out.println( "ルートエレメントの名前:" + root.getTagName() );
// ルートエレメントの名前:test_xml
// ルートエレメントの下にあるノードをノードリストとして取得します。
NodeList testsNodeList = root.getElementsByTagName( "test" );
// 0番目の要素をノードとして取得します。
Node testNode = testsNodeList.item( 0 );
if( testNode.getNodeType() == Node.ELEMENT_NODE )
{
// このノードは「エレメント」です。
System.out.println( "testNode.getNodeValue():このノードは「エレメント」です。" );
// testNode.getNodeValue():このノードは「エレメント」です。
}
// なのでElementインターフェイスにキャストできます。
Element testElement = (Element)testNode;
System.out.println( "ルートエレメントの子エレメントの名前:" + testElement.getTagName() );
// ルートエレメントの子エレメントの名前:test
// <test>タグエレメントの子ノードを取得します。
NodeList testValuesNodeList = testElement.getChildNodes();
// 0番目の要素をノードとして取得します。
Node testValueNode = testValuesNodeList.item( 0 );
if( testValueNode.getNodeType() == Node.TEXT_NODE )
{
// このノードは「テキスト」です。
System.out.println( "testValueNode.getNodeValue():このノードは「テキスト」です。" );
// testValueNode.getNodeValue():このノードは「テキスト」です。
}
// このテキストに当たる文字列を取得します。
String testValue = testValueNode.getNodeValue();
System.out.println( "<test>タグ内の文字列:" + testValue );
// <test>タグ内の文字列:テストです
// <test>タグエレメントにtest属性を加えます。
testElement.setAttribute( "test", "value" );
// エレメントを新規作成してルートエレメントに追加します。
Element element = document.createElement( "test1" );
element.appendChild( document.createTextNode( "テストです" ) );
root.appendChild( element );
// もうひとつ追加します。
element = document.createElement( "test2" );
element.appendChild( document.createTextNode( "テストですって" ) );
root.appendChild( element );
// ここまででXMLの修正が完了しました。
// 最後に出力します。
// StringWriterクラスを通して文字列に出力します。
stringWriter = new StringWriter();
// そのStringWriterクラスをStreamResultクラスに渡して
// 「出力対象」にします。
StreamResult streamResult = new StreamResult( stringWriter );
// XMLドキュメントをDOMSourceクラスに渡して「入力対象」にします。
DOMSource domSource = new DOMSource( document );
// 出力用のTransformer実装クラスを作ります。
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 指定した「入力対象」から「出力対象」へと出力します。
transformer.transform( domSource, streamResult );
// とりあえず出力。
System.out.println( stringWriter.toString() );
// <?xml version="1.0" encoding="UTF-8"?>
// <test_xml>
// <test test="value">テストです</test>
// <test1>テストです</test1><test2>テストですって</test2></test_xml>
// このようにXMLを作成することができます。
// 実際にはこのあとファイルに出力したりサーブレットから
// 返したりします。
}
catch( UnsupportedEncodingException e )
{
// StringクラスのgetBytes()メソッドで、存在しない文字コードを
// 指定された場合にこの例外が投げられます。
e.printStackTrace();
}
catch( TransformerConfigurationException e )
{
// TransformerFactoryクラスのnewTransformer()メソッドの
// 呼び出し中に失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( TransformerException e )
{
// TransformerFactoryクラスのtransform()メソッドで
// 出力に失敗した場合にこの例外が投げられます。
e.printStackTrace();
}
catch( ParserConfigurationException e )
{
// DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
// 呼び出し中に失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( SAXException e )
{
// DocumentBuilderクラスのparse()メソッドの呼び出しで
// パーシングに失敗するとこの例外が投げられます。
e.printStackTrace();
}
catch( IOException e )
{
// DocumentBuilderクラスのparse()メソッドの呼び出しで
// パーシングに失敗するとこの例外が投げられます。
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( stringWriter != null )
{
stringWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.StringWriter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class Sample { public static void main( String[] args ) { // DOMを使用して、XMLのパーシングを行います。 ByteArrayInputStream byteArrayInputStream = null; StringWriter stringWriter = null; try { /** XMLの文字コードです。 */ String XML_TEXT_ENCODE = "UTF-8"; /** XMLの基本部分です。 */ String XML_TEXT_HEADER = "<?xml version='1.0' encoding='UTF-8'?>\n" + "<test_xml>\n" + " <test>テストです</test>\n" + "</test_xml>\n" ; // この文字列を、UTF-8形式のbyte型配列として取り出します。 byte[] bytes = XML_TEXT_HEADER.getBytes( XML_TEXT_ENCODE ); // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。 byteArrayInputStream = new ByteArrayInputStream( bytes ); // パーサーを作ります。 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); // パーシングします。 Document document = documentBuilder.parse( byteArrayInputStream ); // ここまででパーシングが完了しました。 // 次はXMLを修正します。 // ルートエレメント、つまり<test_xml>タグを指すエレメントを取得します。 Element root = document.getDocumentElement(); System.out.println( "ルートエレメントの名前:" + root.getTagName() ); // ルートエレメントの名前:test_xml // ルートエレメントの下にあるノードをノードリストとして取得します。 NodeList testsNodeList = root.getElementsByTagName( "test" ); // 0番目の要素をノードとして取得します。 Node testNode = testsNodeList.item( 0 ); if( testNode.getNodeType() == Node.ELEMENT_NODE ) { // このノードは「エレメント」です。 System.out.println( "testNode.getNodeValue():このノードは「エレメント」です。" ); // testNode.getNodeValue():このノードは「エレメント」です。 } // なのでElementインターフェイスにキャストできます。 Element testElement = (Element)testNode; System.out.println( "ルートエレメントの子エレメントの名前:" + testElement.getTagName() ); // ルートエレメントの子エレメントの名前:test // <test>タグエレメントの子ノードを取得します。 NodeList testValuesNodeList = testElement.getChildNodes(); // 0番目の要素をノードとして取得します。 Node testValueNode = testValuesNodeList.item( 0 ); if( testValueNode.getNodeType() == Node.TEXT_NODE ) { // このノードは「テキスト」です。 System.out.println( "testValueNode.getNodeValue():このノードは「テキスト」です。" ); // testValueNode.getNodeValue():このノードは「テキスト」です。 } // このテキストに当たる文字列を取得します。 String testValue = testValueNode.getNodeValue(); System.out.println( "<test>タグ内の文字列:" + testValue ); // <test>タグ内の文字列:テストです // <test>タグエレメントにtest属性を加えます。 testElement.setAttribute( "test", "value" ); // エレメントを新規作成してルートエレメントに追加します。 Element element = document.createElement( "test1" ); element.appendChild( document.createTextNode( "テストです" ) ); root.appendChild( element ); // もうひとつ追加します。 element = document.createElement( "test2" ); element.appendChild( document.createTextNode( "テストですって" ) ); root.appendChild( element ); // ここまででXMLの修正が完了しました。 // 最後に出力します。 // StringWriterクラスを通して文字列に出力します。 stringWriter = new StringWriter(); // そのStringWriterクラスをStreamResultクラスに渡して // 「出力対象」にします。 StreamResult streamResult = new StreamResult( stringWriter ); // XMLドキュメントをDOMSourceクラスに渡して「入力対象」にします。 DOMSource domSource = new DOMSource( document ); // 出力用のTransformer実装クラスを作ります。 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 指定した「入力対象」から「出力対象」へと出力します。 transformer.transform( domSource, streamResult ); // とりあえず出力。 System.out.println( stringWriter.toString() ); // <?xml version="1.0" encoding="UTF-8"?> // <test_xml> // <test test="value">テストです</test> // <test1>テストです</test1><test2>テストですって</test2></test_xml> // このようにXMLを作成することができます。 // 実際にはこのあとファイルに出力したりサーブレットから // 返したりします。 } catch( UnsupportedEncodingException e ) { // StringクラスのgetBytes()メソッドで、存在しない文字コードを // 指定された場合にこの例外が投げられます。 e.printStackTrace(); } catch( TransformerConfigurationException e ) { // TransformerFactoryクラスのnewTransformer()メソッドの // 呼び出し中に失敗するとこの例外が投げられます。 e.printStackTrace(); } catch( TransformerException e ) { // TransformerFactoryクラスのtransform()メソッドで // 出力に失敗した場合にこの例外が投げられます。 e.printStackTrace(); } catch( ParserConfigurationException e ) { // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの // 呼び出し中に失敗するとこの例外が投げられます。 e.printStackTrace(); } catch( SAXException e ) { // DocumentBuilderクラスのparse()メソッドの呼び出しで // パーシングに失敗するとこの例外が投げられます。 e.printStackTrace(); } catch( IOException e ) { // DocumentBuilderクラスのparse()メソッドの呼び出しで // パーシングに失敗するとこの例外が投げられます。 e.printStackTrace(); } finally { // 最後にclose()メソッドを呼んで後処理をします。 // また、これは必ず行うため、finally内で行います。 try { if( stringWriter != null ) { stringWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( byteArrayInputStream != null ) { byteArrayInputStream.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }