C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#でXMLのDTDに追記


(過去ログ 119 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■70085 / inTopicNo.1)  C#でXMLのDTDに追記
  
□投稿者/ OROCHI (22回)-(2014/02/24(Mon) 15:55:08)

分類:[C#] 

こんにちは、現在C#を使ってXMLのDTDに追記するようなプログラムを書こうとしています

<AB>
(略)
</AB>
  ↓
<AB CD="06"> <!--ここにあるみたいに、CD="06"をABのあとに追加したい-->
(略)
</AB>

途中までは考えたのですが、肝心要のDTDに値を追記する方法がわかりません
また、途中までは以下の方法で行けるかと思ったのですが「要素ABを取得する方法」、「要素CD="06"を追加する方法」で詰まっている状態です
System.Xml.XmlDocument ab = new System.Xml.XmlDocument();
ab.Load((対象のxmlファイルのパス));
// 要素ABを取得?
  ??
// 要素ABにCD="06"を追加
  ??
という流れです。上記2点についてわかる方、いらっしゃいますでしょうか?

引用返信 編集キー/
■70086 / inTopicNo.2)  Re[1]: C#でXMLのDTDに追記
□投稿者/ Hongliang (172回)-(2014/02/24(Mon) 16:13:34)
2014/02/24(Mon) 16:50:42 編集(投稿者)

肝心のXMLにDTDが一切出てきていないようですが…DTDというものを勘違いされていませんかね?

とりあえず、AB要素にCD属性を属性値06で追加する、という要件であるとして。
XmlDocumentから要素の検索する方法は主に3通りです。

1. ツリーを順番にたどっていく
 XmlDocument::DocumentElementから、順番にChildNodesを調べては目的のツリーの要素であることを確認して、次にその要素のChildNodesを調べて…とやっていきます。正直面倒です。

2. XmlElement::GetElementsByTagNameを使う
 要素名が一致する要素の一覧を取得できます。目的の要素がXML内で単一であるなら一番楽かもしれません。

3. SelectNodes/SelectSingleNodeでXPathを使って検索
 XMLの検索に一番よく使われる方法です。ただしXPathというまた独特の構文を持つ言語を学習する必要があります。利用範囲は広いので知っていても損はしないと思いますが。

属性追加については、目的の要素を指すXmlElementオブジェクトさえ手に入れられれば、SetAttributeメソッドを呼び出すだけです。
引用返信 編集キー/
■70094 / inTopicNo.3)  Re[2]: C#でXMLのDTDに追記
□投稿者/ OROCHI (24回)-(2014/02/24(Mon) 18:33:01)
No70086 (Hongliang さん) に返信
> 2014/02/24(Mon) 16:50:42 編集(投稿者)
>
ありがとうございました。とりあえず一番使いやすそうな2で行こうと思います。DTDはまだXMLの学習が不完全なので勘違いしただけです。失礼しました

> 属性追加については、目的の要素を指すXmlElementオブジェクトさえ手に入れられれば、SetAttributeメソッドを呼び出すだけです。
ここが謎なのですが、XmlElementオブジェクトは以下のソースで得られます

System.Xml.XmlDocument ab = new System.Xml.XmlDocument();
ab.Load((対象のxmlファイルのパス));
// ルート要素を取得する
System.Xml.XmlElement element = ab.DocumentElement;

ここまではいいのですが、書き込み対象の要素の選択は以下のソースで良いでしょうか?
また、ここからどうやってABにSetAttributeを使って書き込めば良いのでしょうか?
SetAttributeはXmlelementのメンバーのため、XmlNodeListの値を内包させることができなさそうなのですが・・・
よろしければご回答お願いします

// 書き込み対象の要素を取得する
System.Xml.XmlNodeList list = element.GetElementByTagName("AB");


引用返信 編集キー/
■70096 / inTopicNo.4)  Re[3]: C#でXMLのDTDに追記
□投稿者/ OROCHI (25回)-(2014/02/24(Mon) 18:57:50)
自力でなんとかいけました(キャストできることに気づきませんでした)

System.Xml.XmlDocument ab = new System.Xml.XmlDocument();
ab.Load((対象のxmlファイルのパス));
// ルート要素を取得する
System.Xml.XmlElement element = ab.DocumentElement;

// 書き込み対象の要素を取得する
System.Xml.XmlNodeList list = element.GetElementByTagName("AB");
System.Xml.XmlElement controlTarget=(System.Xml.XmlElement)list.Item(0);

// 要素内に追記したい内容を記述する
controltarget.SetAttribute("CD","06");
ab.save((対象のxmlファイルのパス));

ありがとうございました
解決済み
引用返信 編集キー/
■70097 / inTopicNo.5)  Re[3]: C#でXMLのDTDに追記
□投稿者/ Hongliang (173回)-(2014/02/24(Mon) 19:06:13)
2014/02/24(Mon) 19:08:10 編集(投稿者)

> ここまではいいのですが、書き込み対象の要素の選択は以下のソースで良いでしょうか?
> また、ここからどうやってABにSetAttributeを使って書き込めば良いのでしょうか?
> SetAttributeはXmlelementのメンバーのため、XmlNodeListの値を内包させることができなさそうなのですが・・・
> よろしければご回答お願いします
>
> // 書き込み対象の要素を取得する
> System.Xml.XmlNodeList list = element.GetElementByTagName("AB");

GetElement"s"ByTagNameです。
ABと言う名前の要素は一つのXML内に複数存在する可能性がありますから、返値も当然Listです。
XML中に必ずAB要素が一つ存在し、かつ二つ以上は存在しないと断言できるなら、直接list[0]でアクセスしても良いでしょう。
そうでないなら、リスト内の要素を順番に調べて、目的の要素を探し出す必要があります。
XmlNodeListは文字通りXmlNodeのリストなので、各要素をXmlElementとして扱うにはXmlElementにキャストする必要があります。

// 「要素」がXMLの要素とコレクションの要素でややこしいな。


// と書いていたらすでにご自分で解決されていたので、解決済みを追加。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -