Javaでxmlを扱う方法について

このQ&Aのポイント
  • JavaプログラミングでXMLを扱う方法について詳しく教えてください。
  • XMLファイルをメモリに読み込み、指定の要素を書き換えて出力する方法を教えてください。
  • javaプログラミングに詳しくないので、基本的な手順を教えていただけると助かります。
回答を見る
  • ベストアンサー

Javaでxmlを扱う方法について

Javaプログラミングで、XMLの扱いに詳しくないので、以下をお教えいただけると 嬉しいです。 次のようなXMLファイル(test.xml)があるとします。 <myxml> <version>1</version> <datas> <detail> <id>5</id> <value>234</value> </detail> <detail> <id>10</id> <value>223</value> </detail> <detail> <id>15</id> <value>223</value> </detail> <detail> <id>20</id> <value>223</value> </detail> </datas> </myxml> このXMLをメモリに読み込んで、<id>が10の<detail>だけを書き換えて、 同じファイルに出力するプログラムが組みたいのですが、 javaでのやりかたを 教えていただけませんか? 出力結果は、以下のようにしたいのですが・・・ <myxml> <version>1</version> <datas> <detail> <id>5</id> <value>234</value> </detail> <detail> <id>10</id> <value>424</value> ← ココだけ変えたい </detail> <detail> <id>15</id> <value>223</value> </detail> <detail> <id>20</id> <value>223</value> </detail> </datas> </myxml> 基本的なJavaプログラミングだと思うのですが、javaに詳しくないので、 ご教授いただけると嬉しいです。 よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • HNEX
  • ベストアンサー率62% (43/69)
回答No.3

割と処理が面倒だったので、そのまま例を乗せてみます 例ではsample.xmlを入力ソースとして読み取ってid=10の場合のvalue値を変更してoutput.xmlに出力するサンプルです import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; 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.NodeList; public class XmlTest { public static void main(String[] args) throws Exception { Document document = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse(new File("sample.xml")); NodeList nodeList = document.getElementsByTagName("detail"); for (int i = 0; i < nodeList.getLength(); i++) if ("10".equals(getNodeByName(nodeList.item(i), "id").getTextContent())) getNodeByName(nodeList.item(i), "value").setTextContent("変えたい値"); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty("encoding", "UTF-8"); transformer.transform(new DOMSource(document), new StreamResult(new File("output.xml"))); } public static Node getNodeByName(Node node, String name) { for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) if (name.equals(child.getNodeName())) return child; return null; } }

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

>基本的なJavaプログラミングだと思うのですが、javaに詳しくないので、 >ご教授いただけると嬉しいです。 XMLの操作は基本的なJavaプログラミングではないですよ。 結構面倒です。 http://www.atmarkit.co.jp/ait/series/2340/ あたりを参考にしてみてください。

関連するQ&A

  • XMLデータをPOSTで送信・受信する方法

    PHP初心者です。 以下のようなXMLのデータをPOSTで送信、送信されてきたXMLデータを受信する方法がわからず行き詰っています。 フォームで以下のXMLデータをtest.phpに送ってみようと試しているのですが、valueにXMLのデータをどのようにセットすればいいのかわかりません。 そもそもこの方法が合っているのかどうかも自信がない状態です。 仕事の関係でどうしても今週中に仕上げなければならず、 大変困っています。 どなたかアドバイスをください。 よろしくお願いします。 <form action="test.php" method="post">   <input type="hidden" name="xmldata" value="">   <input type="submit" value="送信"> </form> 【test.xml】 <?xml version="1.0" encoding="UTF-8"?> <test> <sample01>あいうえお</sample01> <sample02>かきくけこ</sample02> </test>

    • 締切済み
    • PHP
  • クイズ作成に関して xml形式の問題をランダムに読み込む方法

    現在、クイズを作っています。 外部のXMLファイルから問題を読み込み、それをランダムに5問出題させ、さらに重複させないようにしたいのですが、経験不足のため思うように出来ません。 flashファイル  //////////////////////////////////// var a_xml:XML = new XML(); a_xml.onLoad = function() { var top:XMLNode = a_xml.firstChild; for(i = 0; i<top.childNodes.length;i++){ var item:XMLNode = top.childNodes[i]; trace(item.attributes.name); } } a_xml.ignoreWhite = true; a_xml.load("xml/test.xml"); //////////////////////////////////// XMLファイル test.xml //////////////////////////////////// <?xml version="1.0" encoding="UTF-8"?> <items> <item name="test1" value="0" /> <item name="test2" value="1" /> <item name="test3" value="2" /> <item name="test4" value="3" /> <item name="test5" value="4" /> <item name="test6" value="5" /> </items> //////////////////////////////////// XMLファイルの読み込みは何とかできたのですが、ここからどうやってランダムに読み込むかが分かりません。 XML要素のnameをランダムで出題したい場合どうしたらいいのですか? ここから先は、多分Math.randomを使うのだろうというレベルでしか分からないため、なんとかご教授お願いできませんか? 環境はwin,FlashMX2004です。

    • ベストアンサー
    • Flash
  • web.xmlの書き方

    web.xmlの書き方 質問させてください webcontent\day5\rsMeta.jspというファイルにブラウザからアクセスしたいのですが、エラーが出ます。 web.xmlの書き方が間違っているのですが、どのように書けばよいでしょうか? 現状のweb.xmlを以下に記載します。 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Jijyodoryoku</display-name> <servlet> <servlet-name>rsMeta</servlet-name> <jsp-file>/day5/rsMeta.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>rsMeta</servlet-name> <url-pattern>/rsMeta</url-pattern> </servlet-mapping> </web-app>

    • ベストアンサー
    • Java
  • 既存のXMLを別のXMLの要素として追加する方法

    JavaでDOMを使用して、既に作成してあるXMLを別のXMLの要素として追加しようと思っているのですが、なかなか上手くいかないので投稿いたしました。 具体的に以下のような既存のXMLファイルがあると仮定して、 <?xml version="1.0" encoding="UTF-8"?> <a> <b>0</b> <c>1</c> <d>2</d> </a> 上記のXMLの親ノード(逆に言えば、このXMLの子ノードとして上記XMLを追加)にあたるXMLは以下のようになっています。 <?xml version="1.0" encoding="UTF-8"?> <A> </A> そして<A>と</A>の間に既存のXMLを追加して、 <?xml version="1.0" encoding="UTF-8"?> <A> <a> <b>0</b> <c>1</c> <d>2</d> </a> </A> のようにしたいと考えています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • perlとXML::Simpleの使い方

    perlを使って、下記のXMLファイルを出力したいです。 <?xml version='1.0' encoding='UTF-8' ?> <member> <No>00001</No> <Product> <ProductSeqNo>0</ProductSeqNo> <ProductName>スマートフォン</ProductName> </Product> <Product> <ProductSeqNo>3</ProductSeqNo> <ProductName>モニタ</ProductName> </Product> <RegistDate>2012/11/29</RegistDate> </member> <Product>タグの部分は、編集情報を設定するため、下記のようにプログラミングしています。 my $p = { member => [ { No => "$id", Product => {}, RegistDate => "$RegistDate" } ] }; my $AddData = { Product => { ProductSeqNo => ["$seqno"], ProductName => ["ProductName"] } }; push(@{$p->{member}}, $AddData); # データを追加 my $x = new XML::Simple; my $xml = $x->XMLout($p, NoAttr=>1, KeepRoot=>1, OutputFile => "$dir/$Details", XMLDecl => "<?xml version='1.0' encoding='UTF-8' ?>"); 上記を動かすと、以下のように出力されます。 <?xml version='1.0' encoding='UTF-8' ?> <member> <No>00001</No> <Product></Product> </member> <member> <Product> <ProductName>ProductName2</ProductName> <ProductSeqNo>1</ProductSeqNo> </Product> </member> 最初のイメージで出力する方法をご存知の方は教えて下さい。

  • xmlを読み込んで、データをリストに・・・

    Javaでxmlファイルを読み込んで、リストに入れたいのです。xmlファイルには <info id="hogehoge" name="sample" </info> <info id="hogehogehoge" name="samplesample" </info> といったようにrootがないxmlファイルになっており、idをリストに入れたいのです。rootタグがないと難しいでしょうか? どなたかご教授願います!

    • ベストアンサー
    • Java
  • PEAR XML_Query2XMLを利用したPHPからFlash(AS3)へのXMLデータの渡し方について。

    毎度お世話になっております。 前回させていただいた質問で、PHPからFlashへのデータ受け渡しをしたいと考えていたところ、XML形式がいいと教えていただき、試していました。 FlashのただのXMLファイルの読み込みはでき、PHPのPEAR XML_Query2XMLを利用してデータベースのデータをXMLに整形することも出来ました。 しかし、その後の連結的な操作が分からず戸惑っております。 お時間があるときでよろしいので、何を使ったらよいかなどアドバイス等を頂ければと思います。 よろしくお願いします。 環境 Flash CS3(AS3) PHP5.2.6 MySQL5.1.29 Apache2.2.10 ・PHPの今のところのプログラム <?php // include required files include 'XML/Query2XML.php'; include 'MDB2.php'; try { // initialize Query2XML object $q2x = XML_Query2XML::factory(MDB2::factory('mysql://ユーザ名:パスワード@localhost/データベース名')); // generate SQL query // get results as XML $sql = "SELECT * FROM table名"; $xml = $q2x->getFlatXML($sql); // send output to browser header('Content-Type: text/xml'); $xml->formatOutput = true; echo $xml->saveXML(); } catch (Exception $e) { echo $e->getMessage(); } ?> ・AS3の今のところのプログラム System.useCodePage = true; // 外部XMLはURLLoaderで読み込む var myLoader:URLLoader = new URLLoader(); myLoader.addEventListener(Event.COMPLETE, completeData); myLoader.load(new URLRequest("test.xml")); // 読み込み完了後の処理 function completeData(event:Event):void { // 読み込んだ文字列をmyXMLに入れる var myXML:XML = new XML(myLoader.data); // データのnameとpriceの値をリストアップ表示 trace(myXML.drink[1].name); for (var i = 0; i < myXML.drink.length(); i++) {; //ダイナミックテキストでi番目を表示 db.text = myXML.drink[i].name trace(myXML.drink[i].name); trace(myXML.drink[i].@price); } } よろしくお願いします^^

    • ベストアンサー
    • PHP
  • javaにて

    javaにてXMLのファイルからCSVファイルの出力を行う プラグラムの参考になるようなサイトご存知でしたら 教えてください。色々探したけどなかなかこれだ!と いうものが見つからないのですが。。。初心者でも解 るサイトだとなお助かります。

  • xml→htmlへの変換&ページ分割したい

    まず、下記のxml、xslによりhtmlページを出力しています。 ■test.xml <?xml version="1.0" encoding="UTF-8"?> <all> <index file_id="a"> <product file_id="a-01"> <yoso>ああああああああああああああああ</yoso> </product> <product file_id="a-02"> <yoso>いいいいいいいいいいいいいいいい</yoso> </product> <product file_id="a-03"> <yoso>うううううううううううううううう</yoso> </product> <product file_id="a-04"> <yoso>ああああああああああああああああ</yoso> </product> <product file_id="a-05"> <yoso>いいいいいいいいいいいいいいいい</yoso> </product> <product file_id="a-06"> <yoso>うううううううううううううううう</yoso> </product> </index> <index file_id="b"> <product file_id="b-01"> <yoso>ああああああああああああああああ</yoso> </product> <product file_id="b-02"> <yoso>いいいいいいいいいいいいいいいい</yoso> </product> <product file_id="b-03"> <yoso>うううううううううううううううう</yoso> </product> <product file_id="b-04"> <yoso>うううううううううううううううう</yoso> </product> </index> <index file_id="c"> <product file_id="c-01"> <yoso>ああああああああああああああああ</yoso> </product> <product file_id="c-02"> <yoso>いいいいいいいいいいいいいいいい</yoso> </product> <product file_id="c-03"> <yoso>うううううううううううううううう</yoso> </product> </index> </all> ■ind.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0" xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect" extension-element-prefixes="redirect"> <xsl:output method="html" encoding="UTF-8"/> <xsl:template match="index"> <!-- 出力ファイル名 --> <xsl:variable name="filename" select="concat('html/',@file_id, '/index.html')"/> <!-- 出力開始 --> <redirect:open select="$filename"/> <redirect:write select="$filename"> <html> <head> <title><xsl:value-of select="@file_id"/></title> </head> <body> <h1><xsl:value-of select="@file_id"/></h1> <xsl:apply-templates /> </body> </html> </redirect:write> <redirect:close select="$filename"/> <!-- 変換報告 --> <xsl:value-of select="concat('『',$filename,'』変換完了')"/> </xsl:template> <xsl:template match="product"> <a> <xsl:attribute name="href"> <xsl:value-of select="concat(@file_id,'.html')" /> </xsl:attribute> <xsl:value-of select="@file_id" /> </a><br /> </xsl:template> </xsl:stylesheet> ■環境 ・xalan-j_2_7_1 ・j2sdk1.4.2_16 ・windowsxp コマンドプロンプトにより下記を実行すると java org.apache.xalan.xslt.Process -in test.xml -xsl ind.xsl html/a/index.html html/b/index.html html/c/index.html が出力されます。 つまりは各カテゴリ(a,b,c)のproduct要素をまとめた インデックスページが出力されます。 ここまでが現状です。 やりたいのは以下です。 上記だとproductの数にかかわらず1ページのindex.htmlに 出力されます。 test.xmlは数が少ないのでいいですが、 仮に1000個あった場合、どんでもないことになってしまうので、 ページ分割をしたいと思っています。(< 1 2 3 4 > みたいな!) ですが、何をどうしたらよいのか皆目見当が付きません。 1ページを10個までとしてそれ以上は次ページに出力みたいなことはできるのでしょうか。 html/a/index.html html/a/index2.html html/a/index3.htmlみたいにです。。。 上記のxslだとmatchするtemplates(index)は3つだけなので、 xalanが書き出すのは3ぺーじだけです。 この書き出す回数をたとえばcount(product div 10)とかにできれば、 なにかみえてきそうなきもするんですが、、、、 長々と申し訳ありませんが、 ご協力お願いします。

    • ベストアンサー
    • XML
  • Javaでlog4jを使ってログ出力を行っています。

    Javaでlog4jを使ってログ出力を行っています。 環境は以下の通りです。 j2sdk1.4.2 log4j1.2.8 log4j.xml内で指定したログファイル(test.log)を別のアプリで開いた状態で Javaプログラムを実行するとコンソールに以下のエラーが出力されます。 【エラー発生処理】 DOMConfiturator.configure(log4j.xml); 【エラー内容】 log4j:ERROR setFile(null, true) call failed java.io.FileNotFoundException : test.log(プロセスはファイルにアクセスできません。 別のプロセスが使用中です。) ファイルを開いているために書き込めず、エラーになってしまうのは良いのですが、 ログを出力しないだけで処理自体は続行してしまいます。 (ログを書き込めなかったらそこで処理を終了したいです。) 「書き込めなかった場合に例外をcatchする」等のことは可能でしょうか?

    • ベストアンサー
    • Java