Лучший способ получить InnerXml XElement? - PullRequest
140 голосов
/ 06 августа 2008

Как лучше всего получить содержимое смешанного элемента 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()
                };

Ответы [ 15 ]

0 голосов
/ 25 октября 2018
var innerXmlAsText= XElement.Parse(xmlContent)
                    .Descendants()
                    .Where(n => n.Name.LocalName == "template")
                    .Elements()
                    .Single()
                    .ToString();

сделает работу за вас

0 голосов
/ 13 августа 2010
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();
}
0 голосов
/ 26 октября 2009

ты знаешь? Лучше всего вернуться к CDATA :( Я смотрю на решения здесь, но я думаю, что CDATA является самым простым и дешевым, но не самым удобным для разработки с tho

0 голосов
/ 18 марта 2009

Интересно, если (обратите внимание, я избавился от b + = и просто есть b +)

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

может быть немного менее эффективным, чем

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

Не уверен на 100% ... но взглянув на Aggregate () и string.Join () в Reflector ... Я думаю Я читаю это как Aggregate, просто добавляя возвращаемое значение, так что по сути вы получаете :

строка = строка + строка

по сравнению со строкой. Кроме того, там есть упоминание о FastStringAllocation или о чем-то еще, что заставляет меня задуматься о том, что ребята из Microsoft могли бы повысить производительность. Конечно, мой .ToArray () называет это моим отрицанием, но я просто хотел предложить другое предложение.

0 голосов
/ 06 августа 2008

Можно ли использовать объекты пространства имен System.Xml для выполнения работы здесь вместо использования LINQ? Как вы уже упоминали, XmlNode.InnerXml - это именно то, что вам нужно.

...