아래 코드에서 혼합된 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 배 이상 빠른 속도로 보다 느린 기술입니까 .
가장 빠른 결과를 위해 발주한 최저속:
내가 예전에는 하나의 XML 문서 (# 39, & # 39 라는 hint&;) 와 동일한 노드입니다 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 회 연속 평균 (짓궂군요) 등에 대한 런입니다. 내가 didn& 포함시키십시오 로드하고 분석할 데 걸리는 시간을 t # 39, XML 문서로 XmlDocument ' ( 시스템.1믈 대한 method)' 또는 '스도쿠망' (for all the others).
내가 더 링크 알고리즘을 사용하는 것이다. (C # - 모든 불러키지 ',' " 헤르망 parent". 반품해야 및 내부 XML 문자열)
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
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());
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
성능이 매우 중요한 경우 (예를 들어, XML, 자주 많은 구문 분석), d, s ',' 방법을 사용하여 I& # 39 Daniel& # 39 크레이트라이더 때마다 . # 39 you& 경우, re 할 일을 한 몇 쿼리합니다 Mike& 사용해야 할 수도 있습니다, s # 39 더 간결하게 전체 메서드입니다.
이를 통해 어떻게 " 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();
}
Keep it simple 및 효율적인:
String.Concat(node.Nodes().Select(x => x.ToString()).ToArray())
결국 이걸 사용하게 되었습니다:
Body = t.Element("body").Nodes().Aggregate("", (b, node) => b += node.ToString());
개인적으로 사용한 방법을 '전체' 확장명은 이너스마르 됐지 작성 방법:
public static string InnerXml(this XElement thiz)
{
return thiz.Nodes().Aggregate( string.Empty, ( element, node ) => element += node.ToString() );
}
그럼 내 클라이언트 코드가 없는 낡은 것과 마찬가지로 간결한 약간만이라도 시스템.1믈 이름공간이:
var innerXml = myXElement.InnerXml();
Greg: 답변을 완전히 다른 답변으로 수정하신 것 같습니다. 제 대답은 예, System.Xml을 사용하여이 작업을 수행 할 수 있지만 LINQ에서 XML로 발을 담그고 싶었습니다.
다른 사람이 필요한 것을 얻기 위해 XElement의 .Value 속성을 사용할 수없는 이유를 궁금해하는 경우를 대비하여 원래 답변을 아래에 남겨 두겠습니다:
그렉: Value 속성은 모든 자식 노드의 모든 텍스트 내용을 연결합니다. 따라서 본문 요소에 텍스트만 포함되어 있으면 작동하지만 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);
도c토스트링 () 또는 doc. ToString (사브루티언스) 높여줍니까 작동합니까. 이아스파스 http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.tostring 지켜보리니 (v = vs. 110)
혹시 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 () 는 다른 제안이다.
여기서 LINQ를 사용하는 대신 System.Xml 네임스페이스 객체를 사용하여 작업을 수행할 수 있나요? 이미 언급했듯이 XmlNode.InnerXml이 바로 필요한 것입니다.
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();
}