Java Project X

○XMLドキュメントの作成

  1. XmlDocumentオブジェクトを構築

      XmlDocument doc = new XmlDocument() ;
    

  2. XmlDocumentオブジェクトのcreateElementメソッドでelement(タグ)を作成

      ElementNode component = (ElementNode) doc.createElement("Component") ;
    

  3. 作成したelementをツリーに追加

      doc.appendChild(component) ;
    

  4. 子elementを作成、親elementに追加

      ElementNode cpu   = (ElementNode) doc.createElement("CPU") ;
      component.appendChild(cpu) ;
    

  5. elementにテキストを設定・追加

      Text titlec = doc.createTextNode("Intel Celeron") ;
      celeron.appendChild(titlec) ;
    

  6. elementに属性を設定

    <方法1>

    Attrオブジェクトを作成して属性値を設定、elementに追加する

      Attr attrib = doc.createAttribute ("attr1");
      attrib.setNodeValue ("value1");
      component.getAttributes().setNamedItem(attrib);
    

    <方法2>

    ElementNodeオブジェクトのsetAttributeメソッドを使う

      component.setAttribute ("attr2", "value2");
    

  7. XMLドキュメントを出力する

    <標準出力に表示>

      doc.write(System.out) ;
    

    <ファイルに出力>

      doc.write(new FileOutputStream(args[0])) ; 
    

  8. 実行結果

    % javac -classpath ../../xml.jar:$(JAVA_HOME)/lib/classes.zip \
      XMLsample1.java
    % java -classpath ../../xml.jar:$(JAVA_HOME)/lib/classes.zip \
      XMLsample1 sample1.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <Component attr1="value1" attr2="value2">
      <CPU>
        <Intel>
          <Celeron>Intel Celeron</Celeron>
          <PentiumIII>Intel PentiumIII</PentiumIII>
          <Xeon>Intel PentiumIII Xeon</Xeon>
        </Intel>
        <AMD>
          <Athlon>AMD Athlon</Athlon>
        </AMD>
      </CPU>
      <Memory />
      <HDD />
    </Component>
    

  9. サンプルプログラム1 <XMLsample1.java>

    import java.io.* ;
    import com.sun.xml.tree.* ;
    import org.w3c.dom.* ;
    
    public class XMLsample1
    {
      public static void main(String args []) throws IOException, DOMException {
        if (args.length != 1) {
          System.err.println("Usage: cmd filename") ;
          System.exit(1) ;
        }
    
        // XmlDocumentオブジェクトを構築
        XmlDocument doc = new XmlDocument() ;
    
        // ドキュメントのルートに"Component"を設定
        ElementNode component = (ElementNode) doc.createElement("Component") ;
        doc.appendChild(component) ;
    
        // "Component"に"CPU"を追加
        ElementNode cpu   = (ElementNode) doc.createElement("CPU") ;
        component.appendChild(cpu) ;
    
        // "CPU"に"Intel"を追加
        ElementNode intel   = (ElementNode) doc.createElement("Intel") ;
        cpu.appendChild(intel) ;
    
        // "Intel"に"Celeron"を追加
        ElementNode celeron = (ElementNode) doc.createElement("Celeron") ;
        intel.appendChild(celeron) ;
    
        // "Intel"に"PentiumIII"を追加
        ElementNode pentium = (ElementNode) doc.createElement("PentiumIII") ;
        intel.appendChild(pentium) ;
    
        // "Intel"に"Xeon"を追加
        ElementNode xeon  = (ElementNode) doc.createElement("Xeon") ;
        intel.appendChild(xeon) ;
    
        // "CPU"に"AMD"を追加
        ElementNode amd   = (ElementNode) doc.createElement("AMD") ;
        cpu.appendChild(amd) ;
    
        // "AMD"に"Athlon"を追加
        ElementNode athlon   = (ElementNode) doc.createElement("Athlon") ;
        amd.appendChild(athlon) ;
    
        // "Component"に"Memory"を追加
        ElementNode memory  = (ElementNode) doc.createElement("Memory") ;
        component.appendChild(memory) ;
    
        // "Component"に"HDD"を追加
        ElementNode hdd   = (ElementNode) doc.createElement("HDD") ;
        component.appendChild(hdd) ;
    
        // "Celeron"にテキスト"Intel Celeron"を設定
        Text titlec = doc.createTextNode("Intel Celeron") ;
        celeron.appendChild(titlec) ;
    
        // "PentiumIII"にテキスト"Intel PentiumIII"を設定
        Text titlep = doc.createTextNode("Intel PentiumIII") ;
        pentium.appendChild(titlep) ;
    
        // "Xeon"にテキスト"Intel PentiumIII Xeon"を設定
        Text titlex = doc.createTextNode("Intel PentiumIII Xeon") ;
        xeon.appendChild(titlex) ;
    
        // "Athlon"にテキスト"AMD Athlon"を設定
        Text titlea = doc.createTextNode("AMD Athlon") ;
        athlon.appendChild(titlea) ;
    
        // "Component"に属性"attr1=value1"を設定
        Attr attrib = doc.createAttribute ("attr1");
        attrib.setNodeValue ("value1");
        component.getAttributes().setNamedItem(attrib);
    
        // "Component"に属性"attr2=value2"を設定
        component.setAttribute ("attr2", "value2");
    
        try {
          // XMLドキュメントをファイルに出力
          doc.write(new FileOutputStream(args[0])) ;
        }
        catch (Exception e) {
          e.printStackTrace() ;
        }
    
        // XMLドキュメントを標準出力に表示
        doc.write(System.out) ;
    
        System.exit(0) ;
      }
    }
    

○XMLファイルを読み込み、任意の場所にelementを追加する
  1. XMLファイルからXmlDocumentオブジェクトを作成する

      XmlDocument doc = XmlDocument.createXmlDocument(
        new FileInputStream(args[0]), false) ;
    

  2. ルートのelementを取得して新たなelementを追加する

      ElementNode component = (ElementNode) doc.getDocumentElement() ;
      ElementNode mb = (ElementNode) doc.createElement("MB") ;
      component.appendChild(mb) ;
    

  3. 任意のelementを取得して新たなelementを追加・挿入する

    <方法1>

    getChildで子elementの列を取得し、番号で指定する

      ElementNode memory = (ElementNode) component.getChildNodes().item(3) ;
      ElementNode sdram = (ElementNode) doc.createElement("SDRAM") ;
      memory.appendChild(sdram) ;
    

    <方法2>

    getElementsByTagNameで名前の一致するelementの列を取得する

      ElementNode athlon = (ElementNode)   doc.getElementsByTagName("Athlon").item(0) ;
      ElementNode amd = (ElementNode) athlon.getParentNode() ;
      ElementNode k6 = (ElementNode) doc.createElement("K6") ;
    

    "AMD"の子elementとして"Athlon"の前に"K6"を挿入する

      amd.insertBefore(k6, athlon) ;
    

  4. 実行結果

    % javac -classpath ../../xml.jar:$(JAVA_HOME)/lib/classes.zip \
      XMLsample2.java
    % java -classpath ../../xml.jar:$(JAVA_HOME)/lib/classes.zip \
      XMLsample2 sample1.xml sample2.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <Component attr1="value1" attr2="value2"> 
      <CPU> 
        <Intel> 
          <Celeron>Intel Celeron</Celeron> 
          <PentiumIII>Intel PentiumIII</PentiumIII> 
          <Xeon>Intel PentiumIII Xeon</Xeon> 
        </Intel> 
        <AMD> 
          <K6>AMD K6</K6>
          <Athlon>AMD Athlon</Athlon> 
        </AMD> 
      </CPU> 
      <Memory>
        <SDRAM />
      </Memory> 
      <HDD /> 
      <MB />
    </Component>
    

  5. サンプルプログラム2 <XMLsample2.java>

    import java.io.* ;
    import com.sun.xml.tree.* ;
    import org.w3c.dom.* ;
    import org.xml.sax.InputSource ;
    import org.xml.sax.SAXException ;
    import org.xml.sax.SAXParseException ;
    
    public class XMLsample2
    {
      public static void main(String args []) {
        if (args.length != 2) {
          System.err.println("Usage: cmd filename") ;
          System.exit(1) ;
        }
    
      try {
        // XMLファイルからXmlDocumentオブジェクトを作成する
        XmlDocument doc = XmlDocument.createXmlDocument(
          new FileInputStream(args[0]), false) ;
    
        // テキストをタグと別の行にする
        doc.getDocumentElement().normalize() ;
    
        // ルートのelementを取得して新たなelementを追加する
        ElementNode component = (ElementNode) doc.getDocumentElement() ;
        ElementNode mb = (ElementNode) doc.createElement("MB") ;
        component.appendChild(mb) ;
    
        // getChildで子elementの列を取得し、番号で指定する
        ElementNode memory = (ElementNode) component.getChildNodes().item(3) ;
        ElementNode sdram = (ElementNode) doc.createElement("SDRAM") ;
        memory.appendChild(sdram) ;
    
        // getElementsByTagNameで名前の一致するelementの列を取得する
        ElementNode athlon = (ElementNode) doc.getElementsByTagName("Athlon").item(0) ;
        ElementNode amd = (ElementNode) athlon.getParentNode() ;
        ElementNode k6 = (ElementNode) doc.createElement("K6") ;
    
        // "AMD"の子elementとして"Athlon"の前に"K6"を挿入する
        amd.insertBefore(k6, athlon) ;
        Text titlek = doc.createTextNode("AMD K6") ;
        k6.appendChild(titlek) ;
    
        // ファイル及び標準出力に表示
        doc.write(new FileOutputStream(args[1])) ;
        doc.write(System.out) ;
      }
      catch (Exception e) {
        e.printStackTrace() ;
      }
    
      System.exit(0) ;
      }
    }
    


All Rights Reserved. Tsuyoshi Nakajima, 1998-2000.
nakajima@umako.c.u-tokyo.ac.jp