C# WPFのプログラムでTreeViewとDOMツリーを連携する方法

このQ&Aのポイント
  • C# WPFのプログラムでTreeViewとDOMツリーを連携する方法について教えてください。
  • TreeViewにXMLの階層構造を表示させ、選択した項目の子ノードを追加するプログラムを作成しています。
  • しかし、エラー「挿入するノードは、異なるドキュメントコンテキストのものです。」が発生してしまいます。解決策を教えてください。
回答を見る
  • ベストアンサー

TreeView と DOMツリー

C# WPF でプログラミングをしています。 TreeView に XML の階層構造を表示させて、ある項目を選択し、ボタンをクリックするとその項目の子ノードが追加されるようにするプログラムを作っています。 選択した項目(TreeView.SelectedItem(Object型)) を、DOMツリーの要素ノード (XmlElement型) にキャストし、それに新しく作った要素ノード(XmlElement型)をつなげるといったようにしているのですが、その際「挿入するノードは、異なるドキュメント コンテキストのものです。」のエラーが発生してしまいます。 XmlElement tvi = treeView.SelectedItem as XmlElement; XmlElement item = doc.CreateElement("item"); tvi.PrependChild(item); // エラー発生箇所 ※ doc は XmlDocument のインスタンスです。 解決策を教えてください。よろしくお願いします。

  • XML
  • 回答数1
  • ありがとう数4

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

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

TreeViewで試してないので自信なし。 例外出るの。 https://ideone.com/fQ04I こうすると出ないの。 https://ideone.com/e3HEI

vortex826
質問者

お礼

解決しました。 新しく XmlDocument を定義して Import するのではなく、 SelectedItem の OwnerDocument をそのまま操作することで目的を達成できました。 ありがとうございました。

vortex826
質問者

補足

回答ありがとうございます。 XmlDocument.ImportNodeを通すことでエラーはでなくなりましたが、今度はXMLにはなにも書き込まれなくなってしまいました。 改良したコードはこんな感じです。 XmlDocument doc = new XmlDocument(); doc.Load(""); XmlElement tvi = treeView.SelectedItem as XmlElement; XmlNode r = doc.ImportNode(tvi, true); XmlElement item = doc2.CreateElement("item"); r.PrependChild(item); doc.Save(""); どうすればいいのでしょうか?何度も申し訳ありませんがよろしくお願いします。

関連するQ&A

  • .NETのTreeViewの項目が一つの場合の画面遷移

    .NETのTreeViewの項目が一つの場合の画面遷移がうまくできません。 'Dim Node As TreeNode 'Dim form2 As New あああ 'Node = TreeView2.SelectedNode 'Select Case Node.Text ' Case "あああ" ' form2.Show() ' Me.Hide() 'End Select とすると、他画面から、TreeViewを経由して遷移させたくても、TreeView内に一つしか選択要素がない場合の画面へは行かず、すぐ上のTreeView内にいくつもの選択要素がある画面へ飛んでしまいます。 単体で動かしたくても、TreeView内に選択項目が一つの場合は動きません。 どなたか、回避する方法をご存知の方お教えください

  • C言語 TreeViewのノードをプログラムで選択

    お世話になっています。 TreeViewをプログラムの内部から選択したり、選択を外したりする方法を探しています。 何かご存知のかた、いらっしゃいましたらご教授いただければ幸いです。 さて、これだけですと「自分で調べろ」と言われそうなので、現在の私のやり方をば。 ただ、Cのカテゴリに投稿していますが実際は言語が違います。 なぜCのカテゴリに投稿したかというと、個人開発言語ですので利用者が少なくほしい情報を得ることが出来ないと考えたためです。 ご了承ください。 なお、言語はActiveBasicというものを使っています。(VBとは文法がかなり違うのであえてCに投稿しています。) 以下、無理矢理Cになおしています。 TVITEM tvi; HWND focus; tvi.mask = TVIF_STATE; tvi.stateMask = TVIS_SELECTED; tvi.state = TVIS_SELECTED; tvi.hItem = [ツリーのノードのハンドル]; SendMessage(hTree,TVM_SETITEM,0,VarPtr(tvi)); このような感じで書いていますが、 SendMessage(hTree,TVM_GETNEXTITEM,&H0009,0); で、選択したはずの値(ハンドル)が返ってきません。 いろいろ試行錯誤しているのですが、どうも理解できないので質問させていただきました。 よろしくお願いします。

  • ToolStripMenuItemのクリックイベントからTreeViewのノードを取得したい

    C#3.5を使用しています。 TreeViewのContestMenuStripのToolStripMenuItemをクリックしたときに どの(複数のノードに同じContestMenuStripをセットしています)TreeViewのノードからのToolStripMenuItemが クリックされたかを知るためにEventArgs e からTreeViewの選択されてるノードが取得したいのですが、 どうすれば良いのでしょうか? private void itemAddToolStripMenuItem_Click(object sender, EventArgs e) { var ev = (System.Windows.Forms.ToolStripItemEventArgs)e;// ToolStripItemEventArgsにキャストすればよいかと思ったのですがエラーになります・・・ }

  • TreeViewのCheckBoxについて

    はじめまして。 以下の環境で開発しています。 Visual studio 2005 Version 8.0.50727.867 (vsvista.050727-8600) .NET Framework Version 2.0.50727 SP2 Visual Basic 2005 TreeView(二階層限定)にCheckBoxを表示させて親ノードのCheckBoxをTrue/Falseすると その子ノードのCheckBoxも全部合わせてTrue/Falseするものを作ろうとしていますが、 CheckBoxクリック時のイベントが拾えません。 どなたかご存知の方がおられましたらご教授ください。 通常のCheckBoxであればPostBackが発生するのですが、TreeViewのCheckBoxにはそのような イベントがありません。 TreeNodeCheckChangedイベントはあるのですが、True/Falseが切り替わったあとにTreeView のラベル選択したときに発生する中途半端なイベントなので使えません。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treeview.aftercheck(VS.80).aspx のヘルプからAfterCheckイベントを調べて試したのですが、 Imports System.Windows.Forms Public Event AfterCheck As TreeViewEventHandler を定義して、以下の関数を書いてみたのですが、 Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck ~中身~ End Sub 「イベントAfterCheckが見つかりません。」とコンパイルエラーとなります。 客先の開発環境なのでバージョンアップ等はできません。 どなたかCheckBoxクリック時のイベントの拾い方をご存知の方がおられましたらご教授お願いします。

  • phpでxmlが動かない macOsXLion

    phpでxmlの練習をしてるんですが全く動作しません。なんででしょうか? コードを次に書きます。 <?php $doc = new DOMDocument; // DOMDocumentのインスタンス生成 $root = $doc->createElement("cars");  // root要素を作成する $doc->appendChild($root); // docの子としてrootを追加する $elm1 = $doc->createElement("car"); // car要素を作成する $root->appendChild($elm1); // car要素をrootの子として追加する $txt1 = $doc->createTextNode("スポーツカー"); // テキストノードを作成する $elm1->appendChild($txt1); // テキストノードをテキスト要素としてelm1の子として追加する $elm2 = $doc->createElement("car"); // car要素を作成する $root->appendChild($elm2); // rootの子としてcar要素を追加する $txt2 = $doc->createTextNode("トラック"); // テキストノードを作成する $elm2->appendChild(txt2); // elm2にtxt2を追加する print $doc->saveXML(); ?> よろしくお願いします。

    • ベストアンサー
    • PHP
  • XML DOM XMLパーサーについて理解していません

    XMLについてイマイチ理解していないので教えてください。PHPでXMLファイルを開いて何らかの処理をするとします。例えば <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("docs/td101.xml") //要素"b"を取得する $bElement = $doc->getElementsByTagName("b")->item(0); //取得した要素"b"に属性"ad"を設定する $bElement->setAttribute("ad","Fukuoka"); //ドキュメントをシリアライズする $doc->save("docs/result101.xml"); ?> のようにXMLファイルに属性を追加するという処理を行うとします。この時、DOMはPHPによって生成されるんでしょうか?またXMLはXMLパーサーによって解析されると本で読んだのですが、この場合PHPがXMLパーサーの機能を持っているんでしょうか?それともブラウザにXMLパーサーの機能があり、ブラウザ側で処理をされているのでしょうか?意味がわからなくて申し訳ないですが、この辺りを理解していなくて・・・御願いいたします。

    • ベストアンサー
    • XML
  • C#のXmlDocumentについて

    C#のXmlDocumentについて質問です。 using System; using System.Xml; using System.Windows; public class XmlNewClass{ public static void Main(String [] args){ XmlDocument xmlObj = new XmlDocument(); xmlObj.Load("./test.xml"); XmlNode nodeObj = xmlObj.GetElementsByTagName("root").Item(0); Console.WriteLine(nodeObj); } } 上記のようなコードがあったとします。 この場合、プロンプトに表示されるないようは 〔System.Xml.XmlElement〕という記述が出力されます。 次に XmlElement elementObj =nodeObj; というコードを追加したとします。 それを実行してみると /****************************************************************** xml.cs(21,26): error CS0266: 型 'System.Xml.XmlNode' を 'System.Xml.XmlElement' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) ***************************************************************************/ というようなエラーがプロンプト上に表示されます。 これはnodeObjがXmlNodeというクラスだということですが (実際GetElementsByTagNameで帰って来るオブジェクトはXmlNodeというクラスだとマニュアルにも記載がありました) なぜ冒頭のコードで Console.WriteLine(nodeObj); の箇所の出力で〔XmlElement〕という内容が出力されたのでしょうか? 同じオブジェクトなのに、なぜ出力と型がことなるのでしょうか? ご教授よろしくお願いします。

  • 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
  • JBuilder6

    今、JBuilder6でネットワーク用のjavaプログラムを作ろうかという話です。 import java.util.*; import java.io.*; import org.w3c.dom.*; import javax.xml.parsers.*; //import org.apache.crimson.tree.XmlDocument; ↑これ入れるとないといわれる。どこにあるのでしょう? ... Document doc = new XmlDocument(); の所を、コンパイルしようとすると、 "xxx.java": エラー #: 300 : クラス XmlDocument が見つかりません: クラス xx.xxxx.xxxxx 行 xx, 列 xx というエラーメッセージが出ます。 この原因と対策についてどなたかご存知の方がいましたら、お願いします。

    • ベストアンサー
    • Java
  • AppendChildができない理由

    ある項目にあるある項目の追加をするイメージで 追加処理をしたいと思っています。 例 A K B A K B 上記の様な階層でXMLのデータがあったとして、 二番目の「A」のKを検索し、あればBを更に追加する。 A K B A K B B(追加) このようなイメージです。 そこで私がコーディングした内容はこうです。 XmlNode = XmlList.Item(Count).SelectNodes("K").Item(0) この時点にくるまでに「A」は検索されており、 Countに何番目の「A」なのかの数値が入っています。 そして、今回のケースでは、 Kは必ず検出されるものと考えてください。 (実際、この時点でKは検出されています) そして、次の関数を読む時、この時の変数XmlNodeを渡してやります。 ちなみに変数XmlNodeは、ノード型で宣言しています。 その後で eleB = XmlDoc.CreateElement("B") eleXmlNode.AppendChild(eleB) を実行すると以下のエラーが表示されます。 「挿入するノードは、異なるドキュメント コンテキストのものです。」 リスト型から項目を検索し、 それをノード型に入れるから問題なんでしょうか。 このエラーの意味もよくわかりません。 ちなみにeleBは、エレメント型で宣言しています。 eleXmlNodeは、変数XmlNodeの値が渡っています。 考えられる可能性でもいいので教えてください。 お願いします。

    • 締切済み
    • XML

専門家に質問してみよう