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に頼りたくないということなんですが、どうしたらよいでしょうか?

A 回答 (1件)

私もあまり詳しくはないんですが、以下のような感じになると思います。


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 ですね。頑張って読むだけの価値はあると思いますよ。

参考URL:http://java.sun.com/xml/jaxp/dist/1.1/docs/tutor …

この回答への補足

ありがとうございました!ちゃんとできました。
ちなみに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)
           ......
といったエラーなんですが、何がいけないか分かりますか?

補足日時:2001/12/13 14:35
    • good
    • 0
この回答へのお礼

appendChildの前に
importNode()メソッドを使って Documentの実装の変換を行いました。
が、 org.w3c.dom.DOMException: DOM003 Namespace error
というエラーが出ました。なんだろう????分かりますか??

お礼日時:2001/12/13 15:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QXMLで特定の兄弟のノードの数を取り出したい(Rubyを使用)

 はじめまして。大学の卒業研究でXMLを利用していたのですが,手詰まりとなってしまいましたので,皆様のご教授に預かりたい思い書き込みました。
 RubyでXMLを加工するプログラムを作っているのですが(Ruby1.6,DOM:XML Parser 0.6.8 http://www.yoshidam.net/Ruby_ja.html#xmlparser),次のようなことしたいと考えています。

<question_solution_tree>
 <node name="ハード・周辺機器"> ←
  <node name="ハード・パソコンパーツ">
   <category>ID-c0001</category>
   <category>ID-c0002</category>
  </node>
  <node name="周辺機器">
   <category>ID-c0007</category>
   <category>ID-c0008</category>
  </node>
  <category>ID-c0015</category>
 </node>
 <node name="オペレーティングシステム(OS)"> ←
  <category>ID-c0016</category>
  <category>ID-c0017</category>
 </node>
 <category>ID-c0019</category>
 <category>ID-c0020</category>
</question_solution_tree>

 このようなXMLがあり,矢印部1階層目のnodeの数(2つ)のみを調べたいと思い,
  @root.getElementsByTagName("node").length
で,nodeの数を取得したのですが,子孫すべてのnodeの数(4つ)を取得してしまいます。getElementByTagName()メソッドは指定したタグをオブジェクト内から全て抽出し、配列形式のコレクションに格納してしまうからです。子孫ではなく,兄弟の矢印の部分のnodeの数を取得するにはどのようにしたらよいのでしょうか。
 ご教授お願いいたします。

 はじめまして。大学の卒業研究でXMLを利用していたのですが,手詰まりとなってしまいましたので,皆様のご教授に預かりたい思い書き込みました。
 RubyでXMLを加工するプログラムを作っているのですが(Ruby1.6,DOM:XML Parser 0.6.8 http://www.yoshidam.net/Ruby_ja.html#xmlparser),次のようなことしたいと考えています。

<question_solution_tree>
 <node name="ハード・周辺機器"> ←
  <node name="ハード・パソコンパーツ">
   <category>ID-c0001</category>
   <category>ID-c0002...続きを読む

Aベストアンサー

実行環境がないので試していませんが、一番簡単なのは
@root.getElementsByTagName("node").length を
@root.getElementsByTagName("question_solution_tree/node").length に
すれば可能と思います。

Qあるノードリストに、特定の名前のノードが存在するかどうか調べたい

ある MSXML2.IXMLDOMNodeList に、特定の名前のノードが存在するかどうか調べたいのですが、
どのようにすればよいでしょうか。
全てのノードを調査すれば私の知識でもできないことはないのですが、
便利なメソッド等はないかと思いまして。。。
(「haschildnodes」って、「特定の」子ノードの存在は調べられませんよね・・・?)

なお、VB.NETでコーディングしています。

ご回答よろしくお願いします。

Aベストアンサー

Xpathが使えるはずです。

Dim nlist As MSXML2.IXMLDOMNodeList
nlist = ObjXml.selectNodes(" ここにXpath記述 ")
(参考)
http://msdn.microsoft.com/ja-jp/library/ms256471(VS.80).aspx

QXSLTを使用したXML->XML変換で...

XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。

以下にXMLを記述します。

----[入力側]-----
<INPUT>
<IN1>
<old>100</old>
<new>100</new>
</IN1>
<IN2>
<IN21>
<old>200</old>
<new>200</new>
</IN21>
<IN22>
<old>300</old>
<new>300</new>
</IN22>
</IN2>
</INPUT>

----[出力側]-----
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>
<OUT12>
<OUT121>
<old>200</old>
<new>200</new>
</OUT121>
<OUT122>
<old>300</old>
<new>300</new>
</OUT122>
</OUT12>
</OUT1>
</OUTPUT>


【質問内容】
 集団項目でないタグ(入力側のIN1およびIN2)を集団項目として出力したい

XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。

以下にXMLを記述します。

----[入力側]-----
<INPUT>
<IN1>
<old>100</old>
<new>100</new>
</IN1>
<IN2>
<IN21>
<old>200</old>
<new>200</new>
</IN21>
<IN22>
<old>300</old>
<new>300</new>
</IN22>
</IN2>
</INPUT>

----[出力側]-----
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>...続きを読む

Aベストアンサー

> 入力側のIN1,IN2が複数回繰り返された場合、
> 出力側もOUT1が複数回繰り返されるって感じです。

IN1とIN2が必ず1対1に対応するという条件でいいなら(複数の組が存在しても可)これでいけるでしょう。



IN1およびIN2以下の構造はオリジナルのまま出力されます。

<xsl:template match="INPUT">
 <OUTPUT>
  <xsl:apply-templates />
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <xsl:text disable-output-escaping="yes">&lt;OUT&gt;</xsl:text>
  <xsl:copy-of select="." />
</xsl:template>
<xsl:template match="IN2">
 <xsl:copy-of select="." />
 <xsl:text disable-output-escaping="yes">&lt;/OUT&gt;</xsl:text>
</xsl:template>

> 入力側のIN1,IN2が複数回繰り返された場合、
> 出力側もOUT1が複数回繰り返されるって感じです。

IN1とIN2が必ず1対1に対応するという条件でいいなら(複数の組が存在しても可)これでいけるでしょう。



IN1およびIN2以下の構造はオリジナルのまま出力されます。

<xsl:template match="INPUT">
 <OUTPUT>
  <xsl:apply-templates />
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <xsl:text disable-output-escaping="yes">&lt;OUT&gt;</xsl:text>
  <xsl:copy-of sele...続きを読む

QVB2005 で encoding="Shift_JIS"や"EUC-JP"のXMLファイルを保存する方法

VB2005, XML の初心者です。

VB2005で encoding="Shift_JIS" や "EUC-JP" のXMLデータをファイルに保存するにはどうすれば良いのでしょうか。
encoding="UTF-8"であれば、下記で保存できますが、="Shift_JIS" や "EUC-JP" になると保存でエラーになってしまいます。

下記ソースでは、strXMLには正しくXMLが入っていますが、saveするとエラーになり、ファイルの中身を確認すると、日本語の箇所で切れていました。

Public Client As TcpClient

Dim stream As NetworkStream
stream = Client.GetStream()

Dim Data(10000) As Byte
Dim len As Int16 = stream.Read(Data, 0, Data.Length)
strXML = System.Text.Encoding.UTF8.GetString(Data, 0, len)

MsxmlDoc = New MSXML2.DOMDocument
Msxmldoc.Loadxml(strXML)
MsxmlDoc.save ( "C:\XML.xml")

文字コードについても初心者ですので、ヒントになるようなことでも教えていただければ幸いです。
よろしくお願い致します。

VB2005, XML の初心者です。

VB2005で encoding="Shift_JIS" や "EUC-JP" のXMLデータをファイルに保存するにはどうすれば良いのでしょうか。
encoding="UTF-8"であれば、下記で保存できますが、="Shift_JIS" や "EUC-JP" になると保存でエラーになってしまいます。

下記ソースでは、strXMLには正しくXMLが入っていますが、saveするとエラーになり、ファイルの中身を確認すると、日本語の箇所で切れていました。

Public Client As TcpClient

Dim stream As NetworkSt...続きを読む

Aベストアンサー

返事が遅くなりました。
すみません。
MSXML2.DOMDocumentでの文字コード指定による保存ですが、OKWave内でJScript.NETを用いた回答が過去にありましたので、参考URLをご覧になってみてください。
FileStreamを使用することで実現できそうです。

>また、初歩的なことかもしれませんが、XMLファイルの宣言文にある文字コード(encoding=)はどのように読めば良いのでしょうか。
読み込んで何をしたいのでしょうか?
System.Xml.XmlDocumentのLoadXMLメソッドを使用すれば、あまり気にしなくても良いと思うのですが...

参考URL:http://okwave.jp/qa1772802.html

Q妥当なXML(Valid XML)のチェックについて

妥当な文書にするためにチェックを行っているのですが
http://validator.w3.org/
ここれでやるとThis page is not Valid (no Doctype found)!といわれ

omitted tag minimization parameter can be omitted only if OMITTAG NO is specified.

などとエラーがでてしまいます。

しかし、http://www.stg.brown.edu/service/xmlvalid/でやるときちんとValidになります。


先生からはhttp://validator.w3.org/でチェックをするときいたのですがどうしてもエラーがでるので
やはりhttp://validator.w3.org/はXHTMLだけでXMLのチェックというものはできないのでしょうか?
XMLのValidかどうかのチェックはhttp://www.stg.brown.edu/service/xmlvalid/でやればいいのでしょうか?

妥当な文書にするためにチェックを行っているのですが
http://validator.w3.org/
ここれでやるとThis page is not Valid (no Doctype found)!といわれ

omitted tag minimization parameter can be omitted only if OMITTAG NO is specified.

などとエラーがでてしまいます。

しかし、http://www.stg.brown.edu/service/xmlvalid/でやるときちんとValidになります。


先生からはhttp://validator.w3.org/でチェックをするときいたのですがどうしてもエラーがでるので
やはりhttp://validator.w3.or...続きを読む

Aベストアンサー

>ファイルをアップロードしてチェックした場合だとSorry! This document can not be checked.

再現した(笑)
[原因]
どうやらファイルアップロードはXML宣言にShift_JISって書いてあっても
us-ascii扱いになってしまうようだ。
で、そのために「ごめんね、マルチバイトの文字は読めないの」って謝られるの。
[回避策]
Extended File Upload Interfaceって奴にアクセスすると
色々指定できる。チェックする時にアップロードして
Encoding:の欄を(detect automatically) [自動的に検出する→us-asciiと検出される]からshift_jisを明示してあげると検証が行われる。

俺は大抵BOM付UTF-8で文書を作ってきちんと自動認識されていたと思う。(BOMなしだとus-asciiとかその他のエンコードだと思われかねないから)
=======================
>This page is not Valid (no Doctype found)!

[原因]
テキスト入力だと「DOCTYPE宣言書け」って書いてあるくせに、
内部サブセットだとDOCTYPE宣言だと認識できず
要素型宣言等をタグだと思い込みやがるらしい。
(当然終了タグに該当するものがないので「きちんと閉じやがれ」って言ってる)
[回避策]
なし。多分仕様。

>ファイルをアップロードしてチェックした場合だとSorry! This document can not be checked.

再現した(笑)
[原因]
どうやらファイルアップロードはXML宣言にShift_JISって書いてあっても
us-ascii扱いになってしまうようだ。
で、そのために「ごめんね、マルチバイトの文字は読めないの」って謝られるの。
[回避策]
Extended File Upload Interfaceって奴にアクセスすると
色々指定できる。チェックする時にアップロードして
Encoding:の欄を(detect automatically) [自動的に検出する→us-asciiと検出...続きを読む


おすすめ情報