XML文書の作成と編集

 XML文書をデータファイルのように使う場合、 つまりレコードを追加したり、変更したりするのに使いたいときには、 DOM(Document Object Model)に基づくJava APIを使います。 以下は、簡単なXML文書をJavaで作る例です。

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.XmlDocument;

public class CreateXMLExample {

  public static void main(String[] args){
    Document doc = new XmlDocument();
    Element root = doc.createElement("文書");
    Node node = doc.appendChild(root);

    Element etori = doc.createElement("取引先");
    node = root.appendChild(etori);

    Element ename = doc.createElement("名称");
    node = etori.appendChild(ename);
    Text tname = doc.createTextNode("南アルプス工業(株)");
    node = ename.appendChild(tname);

    Element ehack = doc.createElement("発注金額");
    node = etori.appendChild(ehack);
    Text thack = doc.createTextNode("0");
    node = ehack.appendChild(thack);

    try{
      ((XmlDocument)doc).write(new PrintWriter(System.out), "Shift_JIS");
    } catch (IOException e){ e.printStackTrace(); }
  }
}
/* end. */

南アルプス市でおなじみの(!!)南アルプス工業です。(もちろん、架空です) 出力は次のようになります。

<?xml version="1.0" encoding="Shift_JIS"?>

<文書>
  <取引先>
    <名称>南アルプス工業(株)</名称>
    <発注金額>0</発注金額>
  </取引先>
</文書>

 次に、このXML文書を読み、「発注金額」を+100したXML文書を標準出力に出力するプログラムは、 以下のようになります。 かなりきたないプログラムですが(^^;;;

import java.io.*;
import java.util.Vector;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.XmlDocument;

class NodeCntrl {
  public NodeCntrl(){ }

  /**
   * <タグ>値</タグ>の、値のノードを取得して返します。
   */
  public Node getTextNode(Node onode){
    NodeList a = onode.getChildNodes();
    for(int i=0; i<a.getLength(); i++){
      Node c = a.item(i);
      if(c.getNodeType() == Node.TEXT_NODE){
        return c;
      }
    }
    return null;
  }

  /**
   * <タグ>値</タグ>の、値を取得して返します。
   */
  public String getTextValue(Node onode){
    Node c = getTextNode(onode);
    return (c == null) ? null : c.getNodeValue();
  }

  /**
   * <タグ>値</タグ>の、値に引数の値をセットします。
   */
  public void setTextValue(Node onode, String newValue){
    Node c = getTextNode(onode);
    if(c != null){
      c.setNodeValue(newValue);
    }
  }

  /**
   * 自分の子ノードの中から、タグ名がtagNameの要素ノードを探し、
   * 最初のノード返します。見つからなければnullを返します。
   */
  public Node getChildElement(Node onode, String tagName){
    Vector v = new Vector();
    NodeList a = onode.getChildNodes();
    for(int i=0; i<a.getLength(); i++){
      Node c = a.item(i);
      if(c.getNodeType() == Node.ELEMENT_NODE){
        if( ((Element)c).getTagName().equals(tagName)){
          return c;
        }
      }
    }
    return null;
  }

  /**
   * 自分の子ノードの中から、タグ名がtagNameの要素ノードを探し、
   * Vectorにして返します。見つからなければnullを返します。
   */
  public Vector getChildElements(Node onode, String tagName){
    Vector v = new Vector();
    NodeList a = onode.getChildNodes();
    for(int i=0; i<a.getLength(); i++){
      Node c = a.item(i);
      if(c.getNodeType() == Node.ELEMENT_NODE){
        if( ((Element)c).getTagName().equals(tagName)){
          v.addElement(c);
        }
      }
    }
    if(v.size() == 0) return null;
    else              return v;
  }
}

public class EditXMLExample {

  private static Document openDocument(String filename)
  throws Exception {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new File(filename));
    return doc;
  }

  public static void main(String[] args) throws Exception {
    Document doc = openDocument("orderhist.xml");
    Node root = doc.getFirstChild();
    if(! ((Element)root).getTagName().equals("文書")){
      System.err.println("エラー: ルート要素のタグ名が「文書」でありません。");
      return;
    }
    NodeCntrl con = new NodeCntrl();
    Node node  = con.getChildElement(root, "取引先");
    Node nodev = con.getChildElement(node, "名称");
    String vendorName = con.getTextValue(nodev);
    Node nodek = con.getChildElement(node, "発注金額");
    int kingaku = Integer.parseInt(con.getTextValue(nodek));

    if(vendorName.indexOf("南アルプス工業") >= 0){
      System.out.println("[" + vendorName + "] [" + kingaku + "]");
      con.setTextValue(nodek, String.valueOf(kingaku + 100));

      try{
        ((XmlDocument)doc).write(new PrintWriter(System.out), "Shift_JIS");
      } catch (IOException e){ e.printStackTrace(); }
    }
  }
}
/* end. */

その出力ですが、

<?xml version="1.0" encoding="Shift_JIS"?>

<文書>
  
  <取引先>
    
    <名称>南アルプス工業(株)</名称>
    
    <発注金額>100</発注金額>
  
  </取引先>

</文書>

このように、読み込むときにXMLパーサーは改行文字をそのまま読むので、 さらに書き出すと改行文字が余計についてしまいます。 これには、出力時にフィルタツールなどを使い、 余分の空行を削除するなどの対策が考えられます。

XML Top

(first uploaded 2002/10/07 last updated (not ever), KQ Taura)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル