2011-10-20 46 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类型包含您正在查找的纯文本的文本节点。