2016-06-08 2 views
0
내가 2013 년

는 값

VS이 사용하는 C# .NET을하고 있어요

나는 아래와 같은 구조를 갖는있어 시나리오를 가지고,

<td> 
    <text text="abc">abc 
    <tspan text = "bcd">bcd 
     <tspan text = "def">def 
      <tspan text = "gef">gef 
      </tspan> 
     </tspan> 
    </tspan> 
    </text> 
</td> 

위와 같이, 얼마나 많은 tspan 노드가 있을지 모르지만, 현재 3 개가 있고, 4 개 이상을 얻을 수 있습니다.

되면 인접한 tspan 노드를 얻기 위해,

labelNode.Attributes["text"].Value 

을 내가 코드를 사용합니다 해당 노드의 값을 얻기 위해, 텍스트 노드를 찾은 후, 나는

labelNode.FirstChild.Attributes["text"].Value 
처럼 사용할 필요가

가 인접한 tspan 노드를 얻기 위해, 나는가는 유지할 이와 같이

labelNode.FirstChild.FirstChild.Attributes["text"].Value 

처럼 사용해야합니다.

이제 5 가지 태그가 있다는 것을 알았다면 "FirstChild"를 5 번 "labelNode"에 동적으로 추가하여 마지막 노드의 텍스트 값을 가져올 수있는 방법이 있습니까?

labelNode.FirstChild.FirstChild.FirstChild.FirstChild.FirstChild.Attributes["text"].Value 

2 번째 값이 필요한 경우 2 회 추가해야하며 3 회 필요하면 3 회 추가해야합니다.

이 문제에 대한 해결책이 있는지 알려 주시기 바랍니다.

제 질문에 혼동이 있으면 제게 질문하십시오.

감사합니다.

static XmlNode GetFirstChildNested(XmlNode node, int level) { 
    XmlNode ret = node; 
    while (level > 0 && ret != null) { 
     ret = ret.FirstChild; 
     level--; 
    } 
    return ret; 
} 

그런 다음이 같은이 기능을 사용할 수 있습니다 :

답변

1

오히려 동적 FirstChild을 추가하는 대신, 나는이 간단한 해결책이 될 것이라고 생각 Xml

var firstChild5 = GetFirstChildNested(labelNode, 5); 
+0

덕분에, 그것은 내 문제를 해결했다. –

1

내가 Linq를 사용하여 제안 할을하는 더 깨끗한 방법으로 파싱을 수행합니다. Xml

XElement (또는 XDocument)이면 Descendant 메서드를 호출하여 계층 구조를 병합하고 필요한 모든 쿼리를 수행 할 수 있습니다.

ex.. 

XElement doc= XElement.Load(filepath);  
var results =doc.Descendants() 
       .Select(x=>(string)x.Attribute("text")); 

//which returns 
abc, 
bcd, 
def, 
gef 

마지막으로 아이를 갖고 싶으면 간단히 사용할 수 있습니다.

ex.. 

XElement doc= XElement.Load(filepath);  
doc.Descendants()     
    .Last() // get last element in hierarchy. 
    .Attribute("text").Value 

세 번째 요소를 얻으려면 다음과 같이하십시오.

XElement doc= XElement.Load(filepath);  
doc.Descendants()     
    .Skip(2) // Skip first two. 
    .First() 
    .Attribute("text").Value ; 

점검 후 @Paolo이 Demo