2012-10-09 76 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因爲微軟已經爲這些類型寫了隱式強制轉換。

相關問題