• ベストアンサー

DOMでパースしているXML全体の出力方法

お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

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

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

  • ベストアンサー
回答No.3

Transformerを使う必要があるのではないでしょうか?

参考URL:
http://www.mclnet.co.jp/tech/java/xml/pretty.html
TAKE-See
質問者

お礼

参考URLの通り実装してみたところ、期待する動作となりました! なるほど、xalanを使うのですね。 ありがとうございました。

その他の回答 (2)

回答No.2

質問を検証しようと思ったんだけど 一つ聞いて良いかなあ… DOMParserクラスの名前空間はどこ? javax.xml.parsers.DocumentBuilder.Parseを使わなかった理由は何だ? http://java.sun.com/javase/6/docs/api/javax/xml/parsers/package-summary.html #getNodeValueでソースを期待するのは間違っていると思う この表見ても分かるとおり http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247

TAKE-See
質問者

お礼

> DOMParserクラスの名前空間はどこ? com.sun.org.apache.xerces.internal.parsers.DOMParser です。 > javax.xml.parsers.DocumentBuilder.Parseを使わなかった理由は何だ? 下記のサイトを参考にしたためです。 http://www.utj.co.jp/xml/dev/dom/dom_1.html > #getNodeValueでソースを期待するのは間違っていると思う 確かに、W3CのドキュメントにDocumentのNodeValueはnullと書いてますね。 勉強になりました。英語は苦手ですが、読むべきですね。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

今環境がないから確認できないけど Nodeインタフェースの メソッドを使ってできたはず

TAKE-See
質問者

お礼

早速のご連絡ありがとうございます。 DocumentインタフェースはNodeインタフェースのサブインタフェース ですので、Nodeインタフェースのメソッド(getNodeValueなど)は 試していたつもりです。実際、getNodeValueではnullが返ります。 具体的なコードサンプルなどや、参考サイトがあれば大変助かります。

関連するQ&A

  • JavaでのXMLパーサの使用について

    javaでパーサを使ってDOMツリーを作成したいのですが、パーサインスタンスが作成できずにエラーがでてしまいます。ちなみにコンパイルは通ります。 以下にソースとエラー内容を記述しますので、もしよろしかったらどなたか教えて下さい。 import java.io.*; import com.ibm.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; public static void main(String[] args){ try{      //XML文書作成 String xml = "<sample>Hello Java World</sample>"; //DOMパーサ作成 DOMParser parser = new DOMParser(); //入力ストリーム作成      StringReader sr = new StringReader(xml); InputSource is = new InputSource(sr); //パースする parser.parse(is); //ドキュメントを得る Document doc = parser.getDocument(); //トップレベル要素を得る Element el = doc.getDocumentElement(); System.out.println("Top Level Element: " + el.getTagName()); } catch(Exception e){ e.printStackTrace(); } } エラー内容: java.lang.NoClassDefFoundError: com.ibm.xml.parsers.DOMParser java.lang.Throwable(java.lang.String) java.lang.Error(java.lang.String) java.lang.LinkageError(java.lang.String) java.lang.NoClassDefFoundError(java.lang.String) void pkxml.dom.PsDomBean.makedom() void pkxml.dom.PsDomBean.makedom() void pkxmlsutabu.Sutabu.main(java.lang.String [])

  • DOMで要素の値がNULL

    どなたか教えてください・・・。 import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.SAXException; ~途中略 xmlPath="test.xml"; DocumentBuilder docBld = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc=docBld.parse(xmlPath); ここで、docの内容を見るとNULLになっています。 この後、 Element el = doc.getDocumentElement(); とすると、しっかりタグ名は取れるにも関わらず 値はNULLになってしまいます。 もちろん例外は何もスローされません。 何が起きているのかさっぱりです。 初めてパーサーにチャレンジしているということもあり、 見当もつかずに戸惑ってばかりです。 確認するところなどがあれば教えてください。 よろしくお願いします。

  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • DOMのXML宣言値の変更

    XMLファイルをXMLパーサを使ってDOMにDocumentクラス変換します。 その変換してできたオブジェクトを操作して、 XML宣言のencodingの値を変更することは可能でしょうか?

    • ベストアンサー
    • Java
  • C++によるDOMのプログラム:「LS」に意味はありますか?

    C++でXML変換プログラムをつくっています。 Xerces c++ (3.0.1)というのを使っているのですが、 ネットでみたところ、パーサの初期化に大きく2通りあるみたいです。 <方法1> char* xmlFile = "employees.xml"; XercesDOMParser* parser = new XercesDOMParser(); parser->parse(xmlFile); DOMDocument* doc = parser->getDocument(); <方法2> char* xmlFile = "employees.xml"; static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull }; DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(gLS); DOMLSParser* parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0); DOMDocument* doc = parser->parseURI(xmlFile); どちらもうまくいくのですが、方法2のやっていることの意味がよくわかりません。他にも、 impl = DOMImplementation::getImplementation() ; ですとか impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("LS")); なども見受けられます。 方法1のように普通に生成するのと、LS指定するのと何か違うのでしょうか。 javaにorg.w3c.dom.lsパッケージなどがあるみたいですし、 http://java.sun.com/javase/ja/6/docs/ja/api/org/w3c/dom/ls/package-summary.html などをみると「ロードおよび保存」とあるので、load と save のことかとも思えるのですが、それが何なのかよくわからないのです。 LSが何を指すのか、方法2のように生成するのがどんな意味があるのかわかる方、教えていただけませんか。 環境: WindowsXP SP3 Visual Studio 2008 SP1

  • Xercesを使ったjavaでのXML解析

    DOMを使ってXML文書を解析するJavaのソースコードで、DOMパーサは、クラス org.apache.xerces.parsers.DOMParserで参照している下記のプログラムで、 [Fatal Error] :17:109: The entity name must immediately follow the '&' in the entity reference. org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 109; The entity name must immediately follow the '&' in the entity reference. のエラーが出てしまって、解決策が分かりかねています。Javaのネットワークプログラミングに詳しい方、御教示願えればと思います。 package nikkei; import java.io.ByteArrayInputStream; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class TwitterSearch { public static void main(String[] args) throws Exception { TwitterSearch search = new TwitterSearch(); search.search("日経ソフトウエア"); } public void search(String keyword) throws Exception { SearchAPIClient client = new SearchAPIClient(); String xml = client.execute(keyword); parse(xml); } private void parse(String xml) throws Exception { DOMParser parser = new DOMParser(); try { parser.parse(new InputSource(new ByteArrayInputStream(xml.getBytes()))); Document doc = parser.getDocument(); NodeList entries = doc.getElementsByTagName("entry"); for (int i = 0; i < entries.getLength(); i++) { String name = null; String tweet = null; Element entry = (Element) entries.item(i); NodeList titleList = entry.getElementsByTagName("title"); if (titleList.getLength() == 1) { tweet = titleList.item(0).getTextContent(); } NodeList authorList = entry.getElementsByTagName("author"); if (authorList.getLength() == 1) { Element author = (Element) authorList.item(0); NodeList nameList = author.getElementsByTagName("name"); if (nameList.getLength() == 1) { name = nameList.item(0).getTextContent(); } } System.out.println(name + "さんのツイート"); System.out.println("\t" + tweet); } } catch (Exception e) { e.printStackTrace(); } } } package nikkei; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; public class SearchAPIClient { public String execute(String keyword) throws Exception { String url = "https://twitter.com/search?q=" + keyword; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); if (entity != null) { return EntityUtils.toString(entity); } else { return null; } } } よろしくお願いいたします。

    • ベストアンサー
    • Java
  • XMLパーサの種類について混乱してます

    XSLTをいじる必要に駆られて、現在Java1.4+JAXP1.1を利用しています。 いままで、javax.xml.transformをimportしてメソッドを実行するだけで、「変換系に何を使っているのか」については全く気にしていなかったのですが、その実体は何なのでしょうか? (XTとかXalanとか、単体の変換系がありますよね・・・?) また、DOMパーサ、SAXパーサもJAXPで使えますが、各々のパーサや変換系を集めてパッケージにしたものがJAXPなんでしょうか。 さらに、勉強中にXMLパーサという単語が出てきて混乱しています。XMLパーサは、DOM・SAX・XSLT等とは違うのでしょうか? (XMLパーサと名乗っているXercesは何に使うのでしょうか・・・) DTDとの関連も含めて解説して頂けたら嬉しいです。

    • ベストアンサー
    • Java
  • XMLの処理について

    javaでxmlをsoapで投げる処理をしています。 <クライアント> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse( new File( "test.xml" ) ); Element elm = doc.getDocumentElement(); result = WebService( elm ); <サーバ> public Object WebService( Element elm ) { return 'elmを処理した結果'; } このクライアントの処理をperlで行いたいのですが、可能でしょうか?  : $service = SOAP::Lite->Service( "xxx.wdsl" ); open( XML, "test.xml" ); @xml = <XML>; ?? ここの処理はどうすれば ?? result = $service.WebService( @xml );  :

  • xml_parseで実体参照が無視される

    phpでxmlをparseするコードを作成していますが、 動きが良く分からないものがあったので質問です。 以下のような、XMLがあります。 ・XML <a>1&lt;2<a> これを以下のようなPHPでparseします。 ・php function func_char($parser, $data){ print "char: $data\n"; } $parser = xml_parser_create(); xml_set_character_data_handler($parser , "func_char"); xml_parse($parser, "<a>1&lt;2<a>"); 出力が以下のようになります。 ・出力結果  char: 1  char: 2 間に"char: <"が出力されるかと思ったのですが、出力されません。 何か心当たりのある方はいらっしゃいますでしょうか? 実行環境 ---------------------- OS:CentOS 5.2 Apache 2.2.9 php 5.2.6 libxml2 2.7.2 ----------------------

    • 締切済み
    • PHP
  • DOMでXML操作

    PHP5でDOMを操作しXMLのタグ情報などを得たいのですがプログラムが動かないので質問させていただきました。 //test.php <?php $doc = new DomDocument; $doc->validateOnParse = true; $doc->Load('book.xml'); echo "ID が books の要素は".$doc->getElementById('books')->tagName . " です。\n"; ?> //book.xml <?xml version="1.0" encoding="shift_JIS"?> <A>   <B id="books">test</B> </A> サンプルプログラムを拾ってきてbooksのtestを取得したいのですがなかなか動きません。実行するとエラー文も何もなく「ID が books の要素は です。 」とだけ表示されます。 環境そのものが整っていないのかも解らないため詳しい方ご教授よろしくお願いします。 現在の環境です。 PHP5 Apache2.0

    • ベストアンサー
    • PHP

専門家に質問してみよう