C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
Re[3]: C#でXMLのDTDに追記
(過去ログ 119 を表示中)
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
トピック表示
ランキング
記事検索
過去ログ
[トピック内 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
-