2011-10-20 44 views
4

我有一個XDocument.For例如,如何從XDocument獲取文本值?

<cars> 
<name> 
<ford>model1</ford> 
    textvalue 
<renault>model2</renault> 
</name> 
</cars> 

如何獲得來自的XDocument文本值?如何識別元素中的文本值

+0

@Hanan Khan - 當然可以。它被稱爲混合內容模型。上述XML格式良好。 –

+0

@DevNull我站好了。它是有效的XML。 http://www.w3schools.com/schema/schema_complex_mixed.asp –

回答

9

文本值由XLINQ解釋爲XTEXT。因此,你可以很容易地檢查一個節點類型XTEXT或通過檢查節點類型看:

// get all text nodes 
var textNodes = document.DescendantNodes() 
         .Where(x => x.NodeType == XmlNodeType.Text); 

然而,這讓我感到你只希望找到一段文字似乎有點寂寞命名textvalue。沒有真正的方法來認識這種有效但不尋常的事情。您可以檢查是否父被命名爲「名」,或者如果textNode本身是單獨還是不見:

// get 'lost' textnodes 
var lastTextNodes = document.DescendantNodes() 
          .Where(x => x.NodeType == XmlNodeType.Text) 
          .Where(x => x.Parent.Nodes().Count() > 1); 

編輯只是一個額外的評論,我看到許多人認爲這個XML是無效的。我不同意這一點。雖然它不漂亮,這是據我所知(和驗證)

+1

+1與其他人不同意,稱XML無效。 –

+0

@DevNull哈哈你好,這聽起來有點奇怪,不同意一個標準... – Polity

+0

你是對的...他們錯了。 ;-) –

3

您可以使用Nodes屬性遍歷文檔根元素的子節點。從那裏,文本節點將被XText實例來表示,他們的文本價值是可以通過他們的Value屬性:

string textValue = yourDoc.Root.Nodes.OfType<XText>().First().Value; 
0

假設變量「文檔」中包含的XDocument代表高於你的XML仍然有效,

doc.XPathSelectElement("cars/name").Nodes().OfType<XText>() 

這應該給你所有的XTEXT類型包含您正在查找的純文本的文本節點。