2010-11-22 4 views

답변

24

는 텍스트 데이터를 찾을 때 <parent> 요소에서 NodeType 속성이인 자식 노드를 찾아야합니다 210. 이 노드의 유형은 XText입니다. 다음 샘플이 보여

var p = XElement 
    .Parse("<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

var textNodes = from c in p.Nodes() 
       where c.NodeType == XmlNodeType.Text 
       select (XText)c; 

foreach (var t in textNodes) 
{ 
    Console.WriteLine(t.Value); 
} 

업데이트 :

var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault(); 
if (firstTextNode != null) 
{ 
    var textValue = firstTextNode.Value; 
    ...do something interesting with the value 
} 

: 당신이 원하는 모든 첫 번째 텍스트 노드 인 경우가있는 경우, 여기 대신 쿼리 이해 구문의 호출 ​​LINQ 방법을 사용하는 예입니다 참고 :First() 또는 FirstOrDefault()을 사용하면이 시나리오에서 Count() > 0보다 성능이 우수합니다. Count은 항상 전체 컬렉션을 열거하지만 일치하는 항목이 발견 될 때까지 FirstOrDefault() 만 열거합니다.

+0

CData 섹션은 어떻게됩니까? (XmlNodeType.CDATA) – dtb

+0

@dtb - cdata 섹션을'XCData' 노드로 찾는다. 텍스트와 CData를 반환하도록 쿼리를 쉽게 확장 할 수 있습니다. –

+0

나는 당신의 문제를 거의 해결했다 ... 그러나 당신의 대답은 더 우아 해 보인다. 내 코드 : if (parent.Nodes()! = null && parent.Nodes(). OfType () .Count()> 0) parentValue = parent.Nodes() OfType () .First(). ; – NiTiN

1

msdn을 찾고해야 XElement를 어떤 특성

에 대한 텍스트/값이 없기 때문에 (말한다 :

이 요소의 텍스트 내용을 모두 포함 된 문자열. 여러 텍스트 노드가있는 경우, 그들은 연결된 것입니다.

그래서 행동이 예상 할 수있다.

당신은 수행하여 문제를 해결할 수 :

string textContent = parent.HasElements ? "" : parent.Value; 
+3

혼합 콘텐츠 요소는 어떻습니까? 예 : ' Hello test1 세계 시험 2!' – dtb

+0

@dtb : parent에는 2 개의 하위 하위 항목과 2 개의 TextNode 하위 항목이 있습니다. –

+0

내 마음이 우글 거리다. 나는 이것이 xml에서 허용되었음을 몰랐다. – Femaref

6

당신은 parent 모든 XText 노드의 값을 연결할 수 :

XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

string result = string.Concat(
    parent.Nodes().OfType<XText>().Select(t => t.Value)); 

// result == "HelloWorld!" 

비교를 위해 :

// parent.Value == "Hellotest1Worldtest2!" 

// (parent.HasElements ? "" : parent.Value) == "" 
+0

'Concat'은리스트의 문자열을 연결하지 않기 때문에 결과를 기대할 수는 없지만 매개 변수의 _type 이름 _은 문자열의 IEnumerable입니다. '.Type.No(). OfType () .Select (t => t.Value) .ToArray());'대신에 필요한 것을 상상해보십시오. – Evariste

0
// Create the XElement 
XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>"); 

// Make a copy 
XElement temp=new XElement(parent); 

// remove all elements but root 
temp.RemoveNodes(); 

// now, do something with temp.value, e.g. 
Console.WriteLine(temp.value); 
1

그것은 어딘가에 Microsoft의 코더가 연결된 및 undelimited 문자열로 모든 텍스트 값을 반환하는 것이 유용 할 것이라고 생각하는 것이 놀랍습니다. 운좋게도 다른 MS 개발자는 XElement 확장을 작성하여 텍스트 노드 here의 "얕은 값"이라고하는 것을 반환합니다. 링크를 클릭에서 겁을받을 사람들을 위해, 함수는 ... 아래

public static string ShallowValue(this XElement element) 
    { 
     return element 
       .Nodes() 
       .OfType<XText>() 
       .Aggregate(new StringBuilder(), 
          (s, c) => s.Append(c), 
          s => s.ToString()); 
    } 

입니다 그리고 당신은, 당신을 너무 당신에게 모든 공백을 제공 (또는 있기 때문에, 다음과 같이 호출 그것을 생각 올 확장 기능에서 무엇이든 다듬을 수 있음)

// element is a var in your code of type XElement ... 
string myTextContent = element.ShallowValue().Trim(); 
관련 문제