- 締切済み
DOMツリーの作り方。
XMLのDOMツリーをjavaで作りたいです。 ---Root.xmlファイル--- <?xml version="1.0!> <root></root> ------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document root = builder.parse("c:/tmp/Root.xml"); /*rootの子ノードとして新しいノード(title)を追加していく*/ といったやり方があると思うんですが、 そうではなく、プログラム内でrootドキュメントを作ってtitle子ノードを追加していきたいんです。 つまり、Root.xmlに頼りたくないということなんですが、どうしたらよいでしょうか?
- myrimyri
- お礼率84% (44/52)
- XML
- 回答数1
- ありがとう数8
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- a-kuma
- ベストアンサー率50% (1122/2211)
私もあまり詳しくはないんですが、以下のような感じになると思います。 DocumentBuilder の parse() メソッドではなく、newDocument() メソッドを使って DOM オブジェクトのインスタンスを作成して、それに Element を追加してゆく、という感じ。 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.newDocument(); Element root = (Element) document.createElement("root"); document.appendChild(root); Element title = (Element) document.createElement("title"); root.appendChild(title); 参考URLに、本家 SUN の JAXP のチュートリアルのページを紹介しておきます。 DOM は Part3 ですね。頑張って読むだけの価値はあると思いますよ。
関連するQ&A
- ストリング文字列をDocumentオブジェクトに格納したい
文字列として受け取ったxmlをDocumentオブジェクトに格納したいと考えて DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(ファイルパス); とすればファイルを取得してDocumentオブジェクトに入れることはできたのですが、ファイルパスではなくString文字列としてxmlを受け取った場合、どのようにすればDocumentオブジェクトに格納できるのかわかりません。 どのようにすればよろしいのでしょうか?
- ベストアンサー
- Java
- StringからDOMのElementオブジェクトを作成したい
Stringから、DOMのDocumentオブジェクトを作成する場合は 以下のようにしますよね。 DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new InputSource(new StringReader("<a/>"))); DocumentではなくElementオブジェクトを作成したいのですが、 どのようにすればよいでしょうか?そもそも、Elementオブジェクト を作成することは可能なんでしょうか? DOMでなく、JDOMでもよいので作成する方法を教えていただけないでしょうか。
- ベストアンサー
- Java
- JAXPでDOMを保存する際、'&'を'&'に展開したくない
当方JAXPでXMLを扱っています。 今悩んでいることなのですが、DOMオブジェクトを保存しようとすると、実態参照をつくることができません。 何かよい方法はありませんか? また、実態参照について、私のほうに根本的な間違いや知らなければならないことがあるのでしょうか。 よろしくお願いします。 ----------サンプルソース------------ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.newDocument(); Element root = document.createElement("root"); // 実態参照を挿入 root.appendChild(document.createTextNode(" ")); document.appendChild(root); // DOMの状態では挿入したものがそのまま参照できる System.out.println("on dom : " + root.getTextContent()); // 保存 Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(System.out)); --------------結果----------------- on dom : <?xml version="1.0" encoding="UTF-8" standalone="no"?><root>&nbsp;</root> --------------望む結果-------------- on dom : <?xml version="1.0" encoding="UTF-8" standalone="no"?><root> </root> --------------------------------------
- ベストアンサー
- Java
- JAXPのDTD検証
JAXPを使ってXMLの解析をしてるのですが、DTD検証を無効にする方法はあるのでしょうか? XMLに、DTDが記述されているとURLを参照しようとしてエラーになってしまいます。 これを無視するようにしたいのですが。。 ---ソース--- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( "hoge._xml" );
- ベストアンサー
- 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 ); :
- 締切済み
- Perl
- Element→Document→InputStream
お世話になります。 バイト配列 buf をもとに、XMLエレメントを作成しています。 ↓↓↓ DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); Document document = builder.parse( new ByteArrayInputStream( buf ) ); Element element = document.getDocumentElement(); 上記、element から バイト配列buf に戻すことは可能でしょうか? (イメージ的に、element.getBytes() のような事をしたいです。) よろしくお願い致します。
- ベストアンサー
- Java
- XMLの読み込み
DocumentBuilderFactory,DocumentBuilder等を使って XMLドキュメントの読み込みを行っています。 例えば、以下の様なXMLドキュメントがあった時 <text>内の読み込みを行うと、テキストテキスト2と なってしまいます。 「テキスト<p/><p/>テキスト2」として取得したいのですが 何かいい方法ないでしょうか? ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <root> <text> テキスト<p/><p/>テキスト2</text> </root> ----------------------------------------- それとも、XMLドキュメント上、「<p/>」に意味があるのでしょうか? ※プログラム一部抜粋 //-- DOMオブジェクト初期化 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); //-- XMLファイル読み込み this.doc = docBuilder.parse(new File(strPath)); this.doc.getDocumentElement().normalize();
- ベストアンサー
- Java
- XMLファイルの読込み方法についての質問
こんにちは、mako-kwnshと申します。 あるXMLを読み込んで指定したノード内 のデータを取り込んだ後、 指定したノードをnode型のデータに 代入したいのですが、 やり方がいまいちわかりません。 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse("c:\\Scenario\\test1.xml"); Element xmlroot = doc.getDocumentElement(); //String first = xmlroot.getNodeName(); // EMSData d3aData = new EMSData(att); // System.out.println("ddd" + d3aData.getValue(D3aCommonInfoPath.SYSTEM_KIND)); // System.out.println("ddd" + xmlroot);
- ベストアンサー
- Java
- 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になってしまいます。 もちろん例外は何もスローされません。 何が起きているのかさっぱりです。 初めてパーサーにチャレンジしているということもあり、 見当もつかずに戸惑ってばかりです。 確認するところなどがあれば教えてください。 よろしくお願いします。
- 締切済み
- Java
- Socket + XML
・クライアントはサーバへXML形式のクエリを送信し、 ・サーバからXML形式のデータを受け取る という単純なプログラムを実装しています。 しかしサーバ側の、InputStreamを引数とするXMLパースメソッドでwaitしてしまって困っています。 かといって、クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまいます。 なるべく一度のコネクションで送受信を終了させたいのですが、よい方法はないでしょうか? 一応、BufferedReaderを利用してXML文章を文字列に落としてから StringReaderをbuilder.parseの引数に与えることで解決出来てはいるのですがスマートではない気がしまして。 [Server側] ServerSocket server_sock = new ServerSocket(12345); Socket sock = server_sock.accept(); /* XMLパーサビルダ生成 */ DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = fact.newDocumentBuilder(); /* ドキュメント docIn の解析 */ Document docIn = builder.parse(sock.getInputStream());//ここから動かない(clientがoutputを終了するまで待っている?) (略) /* 結果ドキュメント docOut の構築*/ Document docOut = builder.newDocument(); (略) /* docOut 送信 */ TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer(); transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream())); sock.getInputStream().close(); sock.getOutputStream().close(); sock.close(); [Client側] Socket sock = new Socket("localhost", 12345); /* XMLパーサビルダ生成 */ DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = fact.newDocumentBuilder(); /* クエリドキュメント docOut の構築*/ Document docOut = builder.newDocument(); (略) /* docOut 送信 */ TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer(); transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream())); sock.getOutputStream().flush(); //sock.getOutputSream().close();//これにすると、socketが閉じてしまう /* 結果ドキュメント docIn の解析 */ Document docIn = builder.parse(sock.getInputStream());//サーバから結果が送信されないので、クライアントはここで停止 (略)
- ベストアンサー
- Java
お礼
appendChildの前に importNode()メソッドを使って Documentの実装の変換を行いました。 が、 org.w3c.dom.DOMException: DOM003 Namespace error というエラーが出ました。なんだろう????分かりますか??
補足
ありがとうございました!ちゃんとできました。 ちなみにtitleを追加するときに、新しいのを作らないで、 データベースから得てきた Node型の<title>タイトル名</title> をroot.appendChild(title) しようとして、エラーが出ました。 org.w3c.dom.DOMException: DOM005 Wrong document at org.apache.xerces.dom.ParentNode.internalInsertBefore(ParentNode.jav :394) at org.apache.xerces.dom.ParentNode.insertBefore(ParentNode.java:326) at org.apache.xerces.dom.NodeImpl.appendChild(NodeImpl.java:224) at addDOM.add_node(addDOM.java:19) ...... といったエラーなんですが、何がいけないか分かりますか?