[解決済み] XElementのInnerXmlを取得する最良の方法は?
質問
の内容を取得するのに最適な方法は何ですか?
body
要素を使用することができますか? この要素にはXHTMLかテキストが含まれているかもしれませんが、私はその内容を文字列で知りたいだけです。 その
XmlElement
型には
InnerXml
プロパティは、まさに私が求めているものです。
以下のようなコードです。
ほとんど
は私が欲しいものを提供してくれますが、周囲の
<body>
...
</body>
要素で、これは必要ない。
XDocument doc = XDocument.Load(new StreamReader(s));
var templates = from t in doc.Descendants("template")
where t.Attribute("name").Value == templateName
select new
{
Subject = t.Element("subject").Value,
Body = t.Element("body").ToString()
};
解決方法は?
そこで、これらの提案された解決策のうち、どれが一番うまく機能するかを確認するために、いくつかの比較テストを行いました。興味本位で、LINQメソッドと昔ながらの System.Xml メソッドを提案しました。そのバリエーションは興味深く、私が予想していたものとは違っていました。最も遅いメソッドは の3倍以上遅い。 .
結果が早い順に並んでいます。
- CreateReader - Instance Hunter(0.113秒)
- 平凡なSystem.Xml - Greg Hurlman (0.134秒)
- 文字列連結による集計 - Mike Powell (0.324秒)
- StringBuilder - Vin (0.333秒)
- String.Join on array - Terry (0.360秒)
- String.Concat on array - Marcin Kosieradzki (0.364)
方法
20個の同一ノードを持つ1つのXML文書('hint'と呼ぶ)を使用しました。
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
上記の秒数表示は、20ノードの"inner XML"を1000回連続で抽出し、5回実行したときの平均(mean)を取った結果です。XMLをロードしてパースして
XmlDocument
(の場合)。
システム.Xml
メソッド)または
XDocument
(それ以外の場合)です。
使用したLINQのアルゴリズムは
(C# - すべて
XElement
親となるXML文字列を返します)
CreateReaderを使用します。
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
文字列連結で集計する。
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilderです。
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
配列にString.Join。
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
配列にString.Concatを実行。
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
ノードに対して .InnerXml を呼び出すだけなので、ここでは "Plain old System.Xml" アルゴリズムを表示していません。
結論
パフォーマンスが重要な場合(例:大量のXML、頻繁にパースされる)、私は次のようにします。
は、ダニエルの
CreateReader
メソッドを毎回
. もし、いくつかのクエリを実行するだけなら、Mikeのもっと簡潔なAggregateメソッドを使用したほうがいいかもしれません。
もしあなたが、たくさんのノード(100個くらい)を持つ大きな要素でXMLを使っているのなら、おそらく
StringBuilder
は、Aggregateメソッドより優れていますが
CreateReader
. 私は
Join
と
Concat
というのは、大きなリストを大きな配列に変換すると、ペナルティが発生するからです(小さなリストであればなおさらです)。
関連
-
[解決済み] .NETで文字列を改行で分割する最も簡単な方法とは?
-
[解決済み] Microsoft.NETFrameworkとMicrosoft.NETFramework64の違いは何ですか?
-
[解決済み] AndroidでWCFサービスを利用する方法
-
[解決済み] Windowsイベントログで参照される「フレームワークのバージョン」とは何ですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] C#で文字を繰り返し表示する最適な方法
-
[解決済み] ファイルが使用中であるかどうかを確認する方法はありますか?
-
[解決済み] アプリケーションフォルダのパスを取得する最適な方法
-
[解決済み] 文字列を反転させる最適な方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WCFとは何か、何ができるのか?
-
[解決済み] WCF エラーの解決。このサービスのメタデータパブリッシングは現在無効になっています。
-
[解決済み] Visual Studioの "ターゲットフレームワーク "が見つからない
-
[解決済み] Windowsイベントログで参照される「フレームワークのバージョン」とは何ですか?
-
[解決済み] AssemblyInfo.csは何に使うのですか?
-
[解決済み] gacutil.exeはどこですか?
-
[解決済み] 文字列から数字を抽出する正規表現
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Microsoft.ACE.OLEDB.12.0' プロバイダがローカルマシンに登録されていません。
-
[解決済み] HashSetとListの性能比較