2016-06-08 83 views
0

我正在此使用C#.NET VS 2013創建XML節點動態獲取其屬性值

我在那裏我有如下結構的情況下,

<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個或更多。

一旦發現文本節點,獲取該節點我將使用代碼的價值,

labelNode.Attributes["text"].Value 

,以獲取其相鄰節點TSPAN後,我不得不使用它像

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

得到它的相鄰節點TSPAN,我不得不使用它像

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

喜歡這個會一直下去。

現在我的問題是,如果我知道我有5個標籤,是否有任何方法動態地將「FirstChild」添加到「labelNode」5次,以便我可以獲取最後一個節點的文本值,如下所示:

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

如果我需要第二個值,我需要添加它2次,如果我需要第三個,那麼我需要添加它三次。

請讓我知道是否有任何解決方案。

請問我,如果你對我的問題感到困惑。

感謝大家提前。

回答

1

而不是增加FirstChild動態,我認爲這將是一個簡單的解決方案:

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

然後,你可以使用此功能是這樣的:

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

謝謝你的職位@Paolo,它解決了我的問題。 –

1

我會用Linq建議到Xml哪些有更清晰的解析方式Xml

使用XElement(或XDocument),可以通過調用​​方法將層次結構扁平化並執行所有必需的查詢。

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 ; 

入住這Demo