2012-10-09 79 views
0

我已经加载XML到的XDocument,看起来是这样的:获取包含“:”的decendant节点?

<MyXML xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyApp.Client.Main.GUI.Report"> 
    <Wrapper xmlns:d2p1="http://schemas.datacontract.org/2004/07/MyApp.Business.Entity"> 
    <d2p1:_MultipelAttributId>156</d2p1:_MultipelAttributId> 
    </Wrapper> 
</MyXML> 

现在我需要得到_MultipelAttributId的价值,但指出这时候:

XElement element = (from cml2 in doc.Descendants("d2p1:_MultipelAttributId") select cml2).FirstOrDefault(); 

我得到异常有关“ :“?

那么我该如何得到价值?

+1

使用'XNamespace'。它必须在你的xml中声明。 –

+0

XML不可更改,但我已更新它以更好地匹配真正的XML。我需要的是获得_MultipelAttributId – Banshee

+1

这个XML是无效的,因为你使用的命名空间前缀'd2p1',但没有声明它。 –

回答

1

您正在查询的元素名称不正确。试试这个:

XElement element = (
    from cml2 in doc.Descendants() 
    where cml2.Name.LocalName == "_MultipelAttributId" 
    select cml2).FirstOrDefault(); 
+0

我认为使用命名空间的解决方案更好。您的解决方案不会阻止元素命名冲突,而命名空间可以消除任何混淆。 –

3
XNamespace ns = "http://schemas.datacontract.org/2004/07/MyApp.Business.Entity"; 

var element = xDoc.Descendants(ns + "_MultipelAttributId").FirstOrDefault(); 
1

这MSDN文章很好地解释了如何使用命名空间中的LINQ工作,以XML http://msdn.microsoft.com/en-us/library/bb669152.aspx

XNamespace d2p1 = "http://schemas.datacontract.org/2004/07/MyApp.Business.Entity"; 
XElement multipelAttributId = doc.Descendants(d2p1 + "_MultipelAttributId").FirstOrDefault(); 

注意,您可以seamly从字符串创建的XNamespace或的XName因为微软已经为这些类型写了隐式强制转换。

相关问题