JavaA2Z

KAB-studio > プログラミング > JavaA2Z > XMLとは

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といったライブラリが存在する。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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();
            }
        }
    }
}
// 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();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/12/01
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。