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 방식을 제안한 방법을 시스템.1믈 비교한 결과 plain old 그렉이야. 있는 것이 아니라 제가 걱정했던것 편차에 흥미로웠다 최저속 메서드을 3 배 이상 빠른 속도로 보다 느린 기술입니까 .

가장 빠른 결과를 위해 발주한 최저속:

  1. 인스턴스입니다 크레이트라이더 헌터 (0.113 초)
  2. Plain old 시스템.1믈 - 그렉이야 헐먼 (0.134 초)
  3. 마이크 파월 (0.324 초) 와 연결 문자열 집합
  4. Vin 스트라이베이더 (0.333 초)
  5. 테리 (0.360 초) 에 어레이입니다 스테링스타인
  6. 마르친 코시라데츠키 (0.364) 의 어레이입니다 스트린g. 콩카트 -
  • 방법 *

내가 예전에는 하나의 XML 문서 (# 39, & # 39 라는 hint&;) 와 동일한 노드입니다 20:


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

무엇보다 초) 로 표시된 숫자를 &quot 추출 분석한 결과, 내부 xml&quot. 20 명 중 노드입니다, 1000년 5 회 연속 평균 (짓궂군요) 등에 대한 런입니다. 내가 didn& 포함시키십시오 로드하고 분석할 데 걸리는 시간을 t # 39, XML 문서로 XmlDocument ' ( 시스템.1믈 대한 method)' 또는 '스도쿠망' (for all the others).

내가 더 링크 알고리즘을 사용하는 것이다. (C # - 모든 불러키지 ',' &quot 헤르망 parent&quot. 반품해야 및 내부 XML 문자열)

  • CreateReader:*
var reader = parent.CreateReader();
reader.MoveToContent();

return reader.ReadInnerXml();
  • 구체화하십시오 concatenation:* 함께 집계
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();
  • 스테링스타인 array:* 대한
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
  • 스트린g. 콩카트 array:* 대한
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());

39 위, t, 내가 haven& &quot Plain old System.Xml&quot. # 39 에 대한 다음과 같은 알고리즘입니다 it& 그냥 콜린스믈 호출하십시오 노드입니다.

    • 결론

성능이 매우 중요한 경우 (예를 들어, XML, 자주 많은 구문 분석), d, s ',' 방법을 사용하여 I& # 39 Daniel& # 39 크레이트라이더 때마다 . # 39 you& 경우, re 할 일을 한 몇 쿼리합니다 Mike& 사용해야 할 수도 있습니다, s # 39 더 간결하게 전체 메서드입니다.

39, re (XML) 를 you& 경우 큰 요소가 많은 노드 (아마 100& # 39, s), 아마도 you& # 39; d '시작' 을 통해 전체 방법을 사용하여 효과를 볼 수 있지만, '크레이트라이더 스트라이베이더 거치지 않고'. 내가 생각하는 ',' t '와' Concat 참가하십시오 don& # 39 더 효율적으로 사용할 수 있는 방법을 판매업체에서 아니하였으매 이러한 조건 때문에 큰 대형 어레이입니다 변환하는 응벌을 목록 (비록 작지만 명백하네 열거합니다 여기).

해설 (7)

내 생각에 이것은 훨씬 더 나은 방법 (# 39 에서 VB, shouldn& 변환하기에 어렵다, t):

지정된 헤르망 x:

Dim xReader = x.CreateReader
xReader.MoveToContent
xReader.ReadInnerXml
해설 (4)

이를 통해 어떻게 &quot extension"; 메서드를 헤르망? 협력했습니다 가져다줄래요!

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();
}
  • 참고 *: 위 코드를 사용할 수 있다 ' ()' 아닌 '엘레멘t. 도스 섬 엘레멘스트레멘츠 ()'. 기억해야 할 매우 중요한 차이가 있다. 'like' 촉각 ',' 모든 기능을 제공하는 엘레멘t. 도스 섬 () ',' 하지만 '만 있는 스테스트 하트리부트 헤르망 요소.
해설 (0)

With all due 크레딧보다 가장 좋은 것을 발견하고, 이들을 위해 외곽진입 (감사합니다!), 이것은 랩된 up in 확장명으로 방법:

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

Keep it simple 및 효율적인:

String.Concat(node.Nodes().Select(x => x.ToString()).ToArray())
  • 메모리 및 성능 비효율적이었습니다 때 전체 는 문자열 연결
  • 참가하십시오 사용하는 것보다 2 배나 되는데 (,, &quot &quot 스테) 가 사용하고 구체화하십시오 어레이입니다 Concat. 외모 아주 이상한 코드.
    • = 하지만 보아하니 홀수입니다 사용하여 매우 많은 것 같은데, # 39, & # 39 를 사용하여 밑구녕만도 +& 않습니다. - 아마도 약간만이라도 최적화되었는지 베케이스 할당에서는 결과는 동일한 코드를 통해 컴파일러와의 사용되지 않고 안전하게 제거할 수 있습니다.
  • 누구나 알고 있는 게 너무 불필요한 &quot 스트라이베이더 리스토어와 state"; 그것은됐다.
해설 (0)

결국 이걸 사용하게 되었습니다:

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

개인적으로 사용한 방법을 '전체' 확장명은 이너스마르 됐지 작성 방법:

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

그럼 내 클라이언트 코드가 없는 낡은 것과 마찬가지로 간결한 약간만이라도 시스템.1믈 이름공간이:

var innerXml = myXElement.InnerXml();
해설 (0)

Greg: 답변을 완전히 다른 답변으로 수정하신 것 같습니다. 제 대답은 예, System.Xml을 사용하여이 작업을 수행 할 수 있지만 LINQ에서 XML로 발을 담그고 싶었습니다.

다른 사람이 필요한 것을 얻기 위해 XElement의 .Value 속성을 사용할 수없는 이유를 궁금해하는 경우를 대비하여 원래 답변을 아래에 남겨 두겠습니다:

그렉: Value 속성은 모든 자식 노드의 모든 텍스트 내용을 연결합니다. 따라서 본문 요소에 텍스트만 포함되어 있으면 작동하지만 XHTML이 포함되어 있으면 모든 텍스트가 함께 연결되지만 태그는 연결되지 않습니다.

해설 (1)

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);
해설 (1)

도c토스트링 () 또는 doc. ToString (사브루티언스) 높여줍니까 작동합니까. 이아스파스 http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.tostring 지켜보리니 (v = vs. 110)

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

대해 작업을 할 수 있습니다

해설 (0)

혹시 if (= 나는 attaboy 디이브이 없애야 할 바로 그 b+ b+)

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

비해 효율성이 약간 덜 수 있습니다

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

100% 쳐다본 것은 설레스버트 http://support. 집합체 () 와 구체화하십시오. I join () 에 다시 읽기 때문에 전체 정보기술 (it) 을 추가 세리스자리 생각하노라 그냥 본질적으로 값을 얻을 수 있습니다.

문자열을 string 구체화하십시오 = +

대對 구체화하십시오. 이 회사는 그 안에 있는 뭔가를 makes me 의 파스트 스트린갈로카션 언급하십시오 참가하십시오 일부 사람들이 Microsoft 에 몇 가지 추가 방황토록 지정값이 것 또는 성능 향상을 거기에. 물론 내 네스토라리 두고 있지만 그것이 싶어서 up call my () 는 다른 제안이다.

해설 (0)

아시죠? 할 수 있는 최선의 일은 뒤로를 CDATA: (im 쳐다보는 솔루션뀉뀉뀉뀉 여기서요 하지만 내가 생각하는 CDATA 는 지금까지 가장 간단하고 가장 편리한 아니라 수천 개발할 수 있는 가장 저렴

해설 (0)

여기서 LINQ를 사용하는 대신 System.Xml 네임스페이스 객체를 사용하여 작업을 수행할 수 있나요? 이미 언급했듯이 XmlNode.InnerXml이 바로 필요한 것입니다.

해설 (0)
public static string InnerXml(this XElement xElement)
{
    //remove start tag
    string innerXml = xElement.ToString().Trim().Replace(string.Format("", xElement.Name), "");
    ////remove end tag
    innerXml = innerXml.Trim().Replace(string.Format("", xElement.Name), "");
    return innerXml.Trim();
}
해설 (2)