2011-01-17 8 views
1

우리는 XML과 같이이 XmlNode.InnerText.

우리는 "노드"요소의있는 XmlNode를 가지고 XmlNode.InnerText 우리에게 반환이 :

"Some text hereChild 1Child2" 
우리는 자식 노드의 내부 텍스트없이 노드 요소의 내부 텍스트를 얻을 수있는 방법

? 이를 달성하기 위해 RegEx 나 문자열 분리를 사용하고 싶지는 않습니다.

참고 :이 XML을 구문 분석하기 위해 다른 클래스 집합을 사용하는 것으로 전환하고 싶지는 않지만 코드 변경이 너무 많습니다.

XmlDocument d=new XmlDocument(); 
d.LoadXml(@"<Example> 
    <Node>Some text here 
    <ChildNode>Child 1</ChildNode> 
    <ChildNode>Child 2</ChildNode> 
    </Node> 
</Example>"); 
var textNodeValues=d.DocumentElement 
    .FirstChild 
    .ChildNodes 
    .Cast<XmlNode>() 
    .Where(x=>x.NodeType==XmlNodeType.Text) 
    .Select(x=>x.Value); 

답변

6
var doc = new XmlDocument(); 
doc.LoadXml(xml); 
var text = doc.SelectSingleNode("Example/Node/text()").InnerText; // or .Value 

반환

"Some text here\r\n " 

text.Trim() 반환

"Some text here" 
+0

이를 시도. InnerText.Trim() – jonathanpeppers

+0

@Jonathan : 네, 동일 합니다만, 그냥 내부 프로세스를 보여주고 싶습니다 – abatishchev

+1

@Jonathan : jfyi, 물결표를 사용하여 코드를 주석으로 강조 할 수 있습니다 : InnerText.Trim()' – abatishchev

1

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<Example><Node>Some text here<ChildNode>Child 1</ChildNode><ChildNode>Child 2</ChildNode></Node></Example>"); 
    XmlNode node = doc.SelectSingleNode("Example/Node"); 
    if (node.HasChildNodes) 
    { 
     string value = node.FirstChild.Value; 
    } 
+0

'FirstOrDefault (x => x.NodeType == XmlNodeType.Text)'가 더 적합합니다. 이 경우에요. 그렇지 않니? – abatishchev

+0

@Abatishchev : 직접 질문에 답하는 것은 맞지만 OP는 다른 텍스트 노드가있는 경우 동작을 지정하지 않습니다. 나는 어쨌든 당신의 Xpath를 선호합니다. – spender

0

당신은 같이 구현할 수 있습니다 :에 대해 어떻게

1

제 생각에는 직접적인 방법은 없습니다. 당신은 연결된 텍스트를 직접 자식 텍스트 노드를 반복하고 구축해야합니다 : 당신은 또한 text() XPath 식을 사용할 수 있습니다

using System.Text; 
using System.Xml; 

public string GetImmediateInnerText(XmlNode node) 
{ 
    StringBuilder builder = new StringBuilder(); 
    foreach (XmlNode child in node.ChildNodes) { 
     if (child.NodeType == XmlNodeType.Text) { 
      builder.Append(child.Value); 
     } 
    } 
    return builder.ToString(); 
} 

, @abatishchev이처럼 : 노드 :

public string GetImmediateInnerText(XmlNode node) 
{ 
    StringBuilder builder = new StringBuilder(); 
    foreach (XmlNode child in node.SelectNodes("text()")) { 
     builder.Append(child.Value); 
    } 
    return builder.ToString(); 
} 
+0

실제로'text()'XPath 함수 – abatishchev

+0

@abatishchev, true이지만'SelectSingleNode()'대신'SelectNodes()'와 함께 사용해야합니다. 그렇지 않으면 단지 요소 :) –

+0

네, 시도하고 당신 말이 맞아. 하지만 일부 텍스트가 하위 노드 다음에 존재하는 경우는 드문 경우라고 생각합니다. IMO 텍스트는 존재하기 때문에 _ 이전에 자식 노드는 희귀합니다 _too_. 또한 해결 방법이 있습니다 :'doc.SelectNodes ("../ text()"). 캐스트 () .Select (n => n.InnerText.Trim())'등. – abatishchev