XMLデータのあるタグの値を書き換えたいと思っています。「/root/b = 10」のように指定すると、以下のように書き換えてくるツール・実装を探しています。Javaがベストですが、他の言語でも構いませんので、サンプルがあれば教えて頂けますか。


書き換え前
<root>
<a>11</a>
<b>12</b>
<c>13</c>
</root>

書き換え後
<root>
<a>11</a>
<b>10</b>
<c>13</c>
</root>
※bタグの値が書き換わっている。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/12/12 13:33:31
  • 終了:2006/12/13 21:02:49

ベストアンサー

id:kronecker No.2

kronecker回答回数88ベストアンサー獲得回数102006/12/12 15:01:29

ポイント50pt

http://www.hellohiro.com/xmldom.htm

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000956.html

あたりを参考にして作ってみました。入力チェックとかは全くやってません。

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

class ParseTest{
  public static void main(String[] args){
    try {
      // DOM作成
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(new File(args[0]));

      // DOMの修正
      Node root = doc.getElementsByTagName(args[1]).item(0);
      Node child = ((Element)root).getElementsByTagName(args[2]).item(0);
      child.replaceChild(doc.createTextNode(args[3]), child.getFirstChild());

      // 出力
      StringWriter stringWriter = new StringWriter();
      StreamResult streamResult = new StreamResult(stringWriter);
      DOMSource domSource = new DOMSource(doc);
      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      transformer.transform(domSource, streamResult);
      System.out.println(stringWriter.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

コンパイル後、

>java ParseTest xmlファイル名 root b 10

とやればbタグの値が書き換わったものが出力されるはずです。入力値の/や=での切り分け、入力チェックなどの機能をつければ望んでいるものができるかと思います。もっと良い実装方法もあるかもしれませんが…

id:er7

頂いたサンプルをベースにツールを作れました。ありがとうございました。

2006/12/13 21:02:18

その他の回答(1件)

id:taneushi No.1

taneushi回答回数9ベストアンサー獲得回数02006/12/12 13:59:17

ポイント20pt

perlでしたら以下のページに乗っているサンプルを組み合わせればできると思います。

http://www.web-ware.org/cgi/npindex/47/open_view.html

id:er7

具体的な実装(サンプル)まで示していただけると助かります。。。ただ、このページは参考になりますね。ありがとうございます。

2006/12/12 14:19:36
id:kronecker No.2

kronecker回答回数88ベストアンサー獲得回数102006/12/12 15:01:29ここでベストアンサー

ポイント50pt

http://www.hellohiro.com/xmldom.htm

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000956.html

あたりを参考にして作ってみました。入力チェックとかは全くやってません。

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

class ParseTest{
  public static void main(String[] args){
    try {
      // DOM作成
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(new File(args[0]));

      // DOMの修正
      Node root = doc.getElementsByTagName(args[1]).item(0);
      Node child = ((Element)root).getElementsByTagName(args[2]).item(0);
      child.replaceChild(doc.createTextNode(args[3]), child.getFirstChild());

      // 出力
      StringWriter stringWriter = new StringWriter();
      StreamResult streamResult = new StreamResult(stringWriter);
      DOMSource domSource = new DOMSource(doc);
      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      transformer.transform(domSource, streamResult);
      System.out.println(stringWriter.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

コンパイル後、

>java ParseTest xmlファイル名 root b 10

とやればbタグの値が書き換わったものが出力されるはずです。入力値の/や=での切り分け、入力チェックなどの機能をつければ望んでいるものができるかと思います。もっと良い実装方法もあるかもしれませんが…

id:er7

頂いたサンプルをベースにツールを作れました。ありがとうございました。

2006/12/13 21:02:18

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません