質問

どのように内容の混合 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 方法を提案するGreg.バリエーションを面白いとは予想をはるかに遅い方法 3倍以上に比べて遅速.

その結果が注文した高速最も遅い:

  1. CreateReader-インスタンスターハンター(0.113秒)
  2. 平野古System.Xml -Greg Hurlman(0.134秒)
  3. 集合と文字列の連結-マイク-パウエル(0.324秒)
  4. StringBuilder-Vin(0.333秒)
  5. 文字列になります。参加に配列-テリー(0.360秒)
  6. 文字列になります。Concatに配列-Marcin Kosieradzki(0.364)

方法

使用した単一のXML文書と同一の20ノードと呼ばれるヒントの'):

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

される確実性信用力に対すと秒以上の結果抽出のための"内部XML"の20ノード1000回連続の平均値(平均)の5運行しています。なかった時間は含まれまでの荷重および構文解析のXMLへ XmlDocumentSystem.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();

文字列になります。また、配列:

return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());

文字列になります。Concatに配列:

return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());

いる"白老System.Xml"アルゴリズムとしてここで呼びかける。InnerXmlるノード。


結論

た場合の性能が重要だということになります(例:多くのXML構文解析していることがあっ 使用エア CreateReader 法時.いう方の数を照会するために使用マイクをより簡潔な集計方法です。

使用している場合は、XMLの大きな要素のノードも100)のため始めているのではないだろうか、健康増進に寄与し StringBuilder 以上の集計方法がない以上 CreateReader.とは思わないの JoinConcat 方法がないことをより効率的にこれらの条件が、違約金に換える大きなリストを大型の配列も明らかなこの小さな方法を例に説明します。.

他のヒント

このしくみは、より良い方法(VB、なくす):

与えられXElement x:

Dim xReader = x.CreateReader
xReader.MoveToContent
xReader.ReadInnerXml

いいこと"拡張子"法XElement?に努めます。

public static string InnerXml(this XElement element)
{
    StringBuilder innerXml = new StringBuilder();

    foreach (XNode node in element.Nodes())
    {
        // append node's xml string to innerXml
        innerXml.Append(node.ToString());
    }

    return innerXml.ToString();
}

または少しのLinq

public static string InnerXml(this XElement element)
{
    StringBuilder innerXml = new StringBuilder();
    doc.Nodes().ToList().ForEach( node => innerXml.Append(node.ToString()));

    return innerXml.ToString();
}

注意:上記のコードを使用 element.Nodes() に対して element.Elements().非常に重要なことは記憶の違いる。 element.Nodes() すべよう XText, XAttribute などが XElement み要素になります。

すべてによる信用者を発見した最適なアプローチ(!), こちらに包まれまでに延長方法

public static string InnerXml(this XNode node) {
    using (var reader = node.CreateReader()) {
        reader.MoveToContent();
        return reader.ReadInnerXml();
    }
}

で簡単に、効率的な:

String.Concat(node.Nodes().Select(x => x.ToString()).ToArray())
  • 集計がメモリ性能を効率が文字列結
  • Using("",sth)では二倍の文字列配列によConcat...やっと不思議です。
  • 利用+=今まで見たこともない数ではなくなるのではないかとの使用'+'-おそらく最適化することと同じコードユ課題の結果は、未使用が安全に削除されるコンパイラです。
  • StringBuilderが必要で、誰もが知っている不必要な"状態"を吸い込み.

当社が使用す:

Body = t.Element("body").Nodes().Aggregate("", (b, node) => b += node.ToString());

個人的には、当社が提供する InnerXml 拡張手法を使の集計方法:

public static string InnerXml(this XElement thiz)
{
   return thiz.Nodes().Aggregate( string.Empty, ( element, node ) => element += node.ToString() );
}

私のクライアントコードはそれとエッセイは英語で書いてのSystem.Xml 名前:

var innerXml = myXElement.InnerXml();

@Greg:で、編集したお答えする完全に異なった答えです。する私の答えとして、予想以上に興味深いことを利用System.Xml もしも自分の足に濡れた状態では、LINQる形式をサポートしています。

てしまい自分に返信できない場合が誰も不思議はなぜできないものXElementます。Valueプロパティを取得しいものが必要

@Greg:のValueプロパティconcatenatesすべてのテキストの内容を子ノード。その場合のbody要素のみを含むテキストでも含む場合は、XHTMLを取得しますべてのテキスト処理してくれるかどうかは,ともにタグです。

//利用Regexうよりは、単なるトリムの開始と終了の要素タグ

var content = element.ToString();
var matchBegin = Regex.Match(content, @"<.+?>");
content = content.Substring(matchBegin.Index + matchBegin.Length);          
var matchEnd = Regex.Match(content, @"</.+?>", RegexOptions.RightToLeft);
content = content.Substring(0, matchEnd.Index);

doc.ToString()またはdoc.ToString(SaveOptionsなのです。見 http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.tostring(v=vs110).aspx

が利用することが可能となるSystem.Xml 名前空間のオブジェクトは、この仕事をここでLINQ?して既述のように、XmlNode.InnerXmlが必要なまさにそのものである.

迷った場合(お知らせんにアクセスにはログイン=としてb+)

t.Element( "body" ).Nodes()
 .Aggregate( "", ( b, node ) => b + node.ToString() );

するのと異なり効率的ではない

string.Join( "", t.Element.Nodes()
                  .Select( n => n.ToString() ).ToArray() );

ない100%のはずが----眺めで骨材()および文字列になります。Join()にリフレクタ...I 考え いただいていましたとして集計だけで追加、返却値は、ほとん:

文字列=文字列+文字列

対文字列になります。参加であろにあるのFastStringAllocationや物を野外で見られるものの街-マイクロソフトリサーチが入れても性能を向上させることである。もちろんmy.ToArray()を呼び出し私の否定するものの、そう思ってやってきましたおも。

ているのはご存知ですか?の最善のことは裏をCDATA:(im見解だと思いCDATAが簡単に安く、最も便利なの開発とカントー

var innerXmlAsText= XElement.Parse(xmlContent)
                    .Descendants()
                    .Where(n => n.Name.LocalName == "template")
                    .Elements()
                    .Single()
                    .ToString();

の登録をお試しください。

public static string InnerXml(this XElement xElement)
{
    //remove start tag
    string innerXml = xElement.ToString().Trim().Replace(string.Format("<{0}>", xElement.Name), "");
    ////remove end tag
    innerXml = innerXml.Trim().Replace(string.Format("</{0}>", xElement.Name), "");
    return innerXml.Trim();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top