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

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

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

Re[5]: XMLのパースでOuterText


(過去ログ 114 を表示中)

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

■67218 / inTopicNo.1)  XMLのパースでOuterText
  
□投稿者/ poppo (5回)-(2013/07/17(Wed) 10:58:35)

分類:[C#] 

.Net 4.0

以下のようなXMLがあったとします。

<root>
<itemA id="id001">
<xxx>

id001の中

</xxx>
</itemA>
<itemA id="id002">
<abc>id002の中</abc>
</itemA>
</root>

上記のXMLをパースしてDictionaryに格納したいのですが
具体的には
Dictionary<string, string> -> key=itemAのid属性値 value=itemA要素のText

1つ目は
key=id001
value=
<itemA id="id001">
<xxx>

id001の中

</xxx>
</itemA>

2つ目は
key=id001
value=
<itemA id="id002">
<abc>id002の中</abc>
</itemA>

のような感じです。
XmlElementクラスにInnerTextはあるのですがOuterTextがありません。
このような事をしたい場合どのようなロジックにすればよいのでしょうか。
引用返信 編集キー/
■67220 / inTopicNo.2)  Re[1]: XMLのパースでOuterText
□投稿者/ Hongliang (70回)-(2013/07/17(Wed) 12:27:46)
> value=
>   <itemA id="id001">
>     <xxx>
> 
>       id001の中
> 
>     </xxx>
>   </itemA>

マークアップを残すのならOuterXmlで良いと思います。
// Dictionary<string, XmlElement>でXmlElementそのまま残してもいいかも。

引用返信 編集キー/
■67221 / inTopicNo.3)  Re[1]: XMLのパースでOuterText
□投稿者/ 魔界の仮面弁士 (259回)-(2013/07/17(Wed) 12:29:35)
2013/07/17(Wed) 12:35:13 編集(投稿者)
No67218 (poppo さん) に返信
> このような事をしたい場合どのようなロジックにすればよいのでしょうか。

var doc = XDocument.Parse(@"<root>
  <itemA id='id001'>
    <xxx>

      id001の中

    </xxx>
  </itemA>
  <itemA id='id002'>
       <abc>id002の中</abc>
  </itemA>
</root>");

var dic = new Dictionary<string, string>();
foreach (var itemA in doc.Root.Elements("itemA"))
{
    dic.Add(itemA.Attribute("id").Value, itemA.ToString());
}

引用返信 編集キー/
■67222 / inTopicNo.4)  Re[1]: XMLのパースでOuterText
□投稿者/ 魔界の仮面弁士 (260回)-(2013/07/17(Wed) 12:34:23)
No67218 (poppo さん) に返信
> このような事をしたい場合どのようなロジックにすればよいのでしょうか。

var doc = new XmlDocument();
doc.LoadXml(@"<root>
  <itemA id='id001'>
    <xxx>

      id001の中

    </xxx>
  </itemA>
  <itemA id='id002'>
       <abc>id002の中</abc>
  </itemA>
</root>");

var dic = new Dictionary<string, string>();
foreach (XmlNode itemA in doc.SelectNodes("/root/itemA"))
{
    dic.Add(itemA.Attributes["id"].Value, itemA.OuterXml);
}

引用返信 編集キー/
■67223 / inTopicNo.5)  Re[2]: XMLのパースでOuterText
□投稿者/ 魔界の仮面弁士 (261回)-(2013/07/17(Wed) 12:42:04)
No67221 (魔界の仮面弁士) に追記
> foreach (var itemA in doc.Root.Elements("itemA"))
『foreach (var itemA in doc.Root.Elements("itemA[@id]"))』の方が良いかも。

先のコードだと、id属性の無いitemA要素が含まれていたときにエラーになりますが、
上記のようにすれば、そのような物は単に読み飛ばされます。


>    dic.Add(itemA.Attributes["id"].Value, itemA.OuterXml);
同じ id が複数ありうる場合は
 dic[itemA.Attributes["id"].Value] = itemA.OuterXml;
にすれば、後書き優先で記録されます。

引用返信 編集キー/
■67224 / inTopicNo.6)  Re[2]: XMLのパースでOuterText
□投稿者/ poppo (6回)-(2013/07/17(Wed) 13:12:27)
ありがとうございます。

何かいろいろと勘違いしていたようです。

InnerTextはテキスト要素のみ抽出するのですね

この掲示板でのスペースの記述方法がわからないので、見難いと思いますが

<itemA id='id001'>
<xxx>

<itemA id='id001'>と<xxx>の間に半角スペースや改行が入っていれば
それも取得してDictionaryに格納したかったのですが
考えてみるとXMLはそのような改行と半角は無視される仕様なはずですし
やはりテキストをパースしていくしかないのでしょうか。

最終的に実現したい事は
AファイルのXMLを読み込んでBファイルのXMLに要素を追加したいのですが
その時に要素の前後の改行や半角スペースなども同じようにコピーしたいです。

引用返信 編集キー/
■67225 / inTopicNo.7)  Re[3]: XMLのパースでOuterText
□投稿者/ poppo (7回)-(2013/07/17(Wed) 13:15:32)
> 最終的に実現したい事は
> AファイルのXMLを読み込んでBファイルのXMLに要素を追加したいのですが
> その時に要素の前後の改行や半角スペースなども同じようにコピーしたいです。

すみません。
追加というよりはBファイル内は文字列置換で処理したいです。

以下Bファイルの内容
<root>
...
${AFILE_REPLACE}
</root>

${AFILE_REPLACE}をAファイルのある要素を読み込んで文字列置換したい


後出しになってしまい申し訳ありません。
引用返信 編集キー/
■67226 / inTopicNo.8)  Re[4]: XMLのパースでOuterText
□投稿者/ Hongliang (71回)-(2013/07/17(Wed) 13:38:18)
PreserveWhitespaceプロパティで空白ノードの対応を変更できます。
引用返信 編集キー/
■67228 / inTopicNo.9)  Re[4]: XMLのパースでOuterText
□投稿者/ 魔界の仮面弁士 (262回)-(2013/07/18(Thu) 02:52:00)
No67225 (poppo さん) に返信
> 追加というよりはBファイル内は文字列置換で処理したいです。

XmlDocument なら InnerXml、ReplaceChild等。
XDocument なら ReplaceNodes、ReplaceWith等。
引用返信 編集キー/
■67246 / inTopicNo.10)  Re[5]: XMLのパースでOuterText
□投稿者/ poppo (8回)-(2013/07/19(Fri) 09:10:44)
> PreserveWhitespaceプロパティで空白ノードの対応を変更できます。
> XmlDocument なら InnerXml、ReplaceChild等。
ありがとうございます。
思っていたものができそうです。
助かりました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -