Java - DOM を使った XML 文書の読込み


■ページ目次

Top

DOM

Top
Xerces
Top

DOMの参照

Top
整形式 XML 文書の取得
Top
例題

  1. 整形式を検査するアプリケーション "DomParser01.java" を作成してください。
    1. import org.apache.xerces.parsers.DOMParser;
    2. import org.w3c.dom.Document;
    3. import org.xml.sax.SAXParseException;
    4. public class DomParser01 {
    5. public static void main(String[] args) {
    6. try {
    7. // DOMパーサの生成
    8. DOMParser parser = new DOMParser();
    9. // XML文書の取得
    10. parser.parse(args[0]);
    11. // Documentインスタンスの取得
    12. Document doc = parser.getDocument();
    13. System.out.println("整形式 XML 文書です。");
    14. } catch (SAXParseException e) {
    15. e.printStackTrace();
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. }
    □ XML 文書("emp.xml")
    1. <?xml version="1.0" encoding="Shift_JIS"?>
    2. <!DOCTYPE 社員 SYSTEM "emp.dtd">
    3. <社員>
    4. <名前 ID="A001">
    5. <名字 ふりがな="うえだ">上田</名字>
    6. <イニシャル>U</イニシャル>
    7. <給与>1000</給与>
    8. </名前>
    9. <名前 ID="A002">
    10. <名字 ふりがな="ながの">長野</名字>
    11. <イニシャル>N</イニシャル>
    12. <給与>1200</給与>
    13. </名前>
    14. <名前 ID="A003">
    15. <名字 ふりがな="まつもと">松本</名字>
    16. <イニシャル>M</イニシャル>
    17. <給与>1030</給与>
    18. </名前>
    19. <名前 ID="A004">
    20. <名字 ふりがな="えひめ">愛媛</名字>
    21. <イニシャル>E</イニシャル>
    22. <給与>1400</給与>
    23. </名前>
    24. </社員>
    □ DTD 文書("emp.dtd")
    1. <?xml version="1.0" encoding="Shift_JIS"?>
    2. <!ELEMENT 社員 (名前+)>
    3. <!ELEMENT 名前 (名字, イニシャル, 給与)>
    4. <!ELEMENT 名字 (#PCDATA)>
    5. <!ELEMENT イニシャル (#PCDATA)>
    6. <!ELEMENT 給与 (#PCDATA)>
    7. <!ATTLIST 名前 ID ID #REQUIRED>
    8. <!ATTLIST 名字 ふりがな CDATA #REQUIRED>
    □実行結果
    $ java DomParser01 emp.xml
    整形式 XML 文書です。
    
Top
実習

  1. 上記 XML 文書"emp.xml"、DTD 文書"emp.dtd" を変更して、整形式かどうか、また、妥当かどうかを検証してください。
Top
妥当な XML 文書の取得
Top
例題

  1. 妥当性を検査するアプリケーション "DomParser02.java" を作成してください。
    1. import org.apache.xerces.parsers.DOMParser;
    2. import org.w3c.dom.Document;
    3. import org.xml.sax.SAXParseException;
    4. public class DomParser02 {
    5. public static void main(String[] args) {
    6. try {
    7. // DOMパーサの生成
    8. DOMParser parser = new DOMParser();
    9. // 妥当性検証の設定
    10. parser.setFeature("http://xml.org/sax/features/validation", true);
    11. // XML文書の取得
    12. parser.parse(args[0]);
    13. // Documentインスタンスの取得
    14. Document doc = parser.getDocument();
    15. System.out.println("整形式 XML 文書です。");
    16. } catch (SAXParseException e) {
    17. e.printStackTrace();
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }

    □XML 文書("emp.xml")

    □DTD 文書("emp.dtd")

    □実行結果

    $ java DomParser02 emp.xml
    整形式 XML 文書です。
    
Top
実習

  1. 上記 XML 文書"emp.xml"、DTD 文書"emp.dtd" を変更して、整形式かどうか、また、妥当かどうかを検証してください。
Top

ノードの参照

Top
すべての要素を取り出す
Top
例題

  1. DOM を使って、XML 文書のすべての要素や属性を取得するアプリケーション "DomParser11.java" を作成してください。
    1. import org.apache.xerces.parsers.DOMParser;
    2. import org.w3c.dom.Document;
    3. import org.w3c.dom.NamedNodeMap;
    4. import org.w3c.dom.NodeList;
    5. import org.xml.sax.SAXParseException;
    6. public class DomParser11 {
    7. public static void main(String[] args) {
    8. System.out.println("document = " + toString(getDocument(args[0])));
    9. }
    10. public static Document getDocument(String fileName) {
    11. try {
    12. // DOMパーサの生成
    13. DOMParser parser = new DOMParser();
    14. // XML文書の取得
    15. parser.parse(fileName);
    16. // Documentインスタンスの取得
    17. return parser.getDocument();
    18. } catch (SAXParseException e) {
    19. e.printStackTrace();
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. }
    23. return null;
    24. }
    25. public static String toString(Document doc) {
    26. StringBuffer sb = new StringBuffer();
    27. StringBuffer indent = new StringBuffer("+");
    28. // ドキュメントのすべてのタグのNodeListを取得する
    29. NodeList nlist = doc.getElementsByTagName("*");
    30. NodeList childlist = null;
    31. NamedNodeMap map = null;
    32. // ノードリストをたどる
    33. for (int i = 0; i < nlist.getLength(); i++) {
    34. sb.append("\n" + indent + "<elem>" + nlist.item(i).getNodeName());
    35. sb.append(" = " + nlist.item(i).getNodeValue());
    36. indent.insert(0, " ");
    37. if (nlist.item(i).hasAttributes()) {
    38. map = nlist.item(i).getAttributes();
    39. // 属性情報を取り出す(アルファベット順)
    40. for (int j = 0; j < map.getLength(); j++) {
    41. sb.append("\n" + indent + "<attr>"
    42. + map.item(j).getNodeName());
    43. sb.append(" = " + map.item(j).getNodeValue());
    44. }
    45. }
    46. if (nlist.item(i).hasChildNodes()) {
    47. childlist = nlist.item(i).getChildNodes();
    48. for (int j = 0; j < childlist.getLength(); j++) {
    49. sb.append("\n" + indent + "<body>"
    50. + childlist.item(j).getNodeName());
    51. sb.append(" = " + childlist.item(j).getNodeValue());
    52. }
    53. }
    54. indent.delete(0, 2);
    55. }
    56. return sb.toString();
    57. }
    58. }

    □XML 文書("emp.xml")

    □DTD 文書("emp.dtd")

    □実行結果

    $ java DomParser11 emp.xml
    document = 
    +<elem>社員 = null
      +<body>#text = 
        
      +<body>名前 = null
      +<body>#text = 
        
      +<body>名前 = null
      +<
    body>#text = 
        
      +<
    body>名前 = null
      +<body>#text = 
        
      +<body>名前 = null
      +<body>#text = 
    
    +<elem>名前 = null
      +<attr>ID = A001
      +<body>#text = 
            
      +<body>名字 = null
      +<body>#text = 
            
      +<body>給与 = null
      +<body>#text = 
            
      +<body>イニシャル = null
      +<body>#text = 
        
    +<elem>名字 = null
      +<attr>ふりがな = うえだ
      +<body>#text = 上田
    +<elem>給与 = null
      +<body>#text = 1000
    +<
    elem>イニシャル = null
      +<
    body>#text = U
    +<elem>名前 = null
      +<attr>ID = A002
      +<body>#text = 
            
      +<body>名字 = null
      +<body>#text = 
            
      +<body>イニシャル = null
      +<body>#text = 
            
      +<body>給与 = null
      +<body>#text = 
        
    +<elem>名字 = null
      +<attr>ふりがな = ながの
      +<body>#text = 長野
    +<elem>イニシャル = null
      +<body>#text = N
    +<elem>給与 = null
      +<body>#text = 1200
    +<
    elem>名前 = null
      +<
    
    attr>ID = A003
      +<body>#text = 
            
      +<body>名字 = null
      +<body>#text = 
            
      +<body>イニシャル = null
      +<body>#text = 
            
      +<body>給与 = null
      +<body>#text = 
        
    +<elem>名字 = null
      +<attr>ふりがな = まつもと
      +<body>#text = 松本
    +<elem>イニシャル = null
      +<body>#text = M
    +<elem>給与 = null
      +<body>#text = 1030
    +<elem>名前 = null
      +<attr>ID = A004
      +<body>#text = 
            
      +<body>名字 = null
      +<body>#text = 
            
      +<body>イニシャル = null
      +<body>#text = 
            
      +<body>給与 = null
      +<body>#text = 
        
    +<elem>名字 = null
      +<attr>ふりがな = えひめ
      +<body>#text = 愛媛
    +<elem>イニシャル = null
      +<body>#text = E
    +<elem>給与 = null
      +<body>#text = 1400
    
Top
DOM関連のオブジェクト
Top

inserted by FC2 system