2016-07-05 40 views
1

*我完全不熟悉這個,這是我正在做的個人項目。 *不確定如何使用LINQ訪問這個特定的元素

所以我有結構性這樣

<Licensing key="20325"> 
    <Organization Org="500"> 
    <Constraints> 
     <MaximumOrgsInSecurity>2</MaximumOrgsInSecurity> 
     <MaximumUsersInSecurity>999</MaximumUsersInSecurity> 
     <MaximumLoggedInUsers>999</MaximumLoggedInUsers> 
     <MaximumLenders>1</MaximumLenders> 
     <OptOutofPasswordPolicy>FALSE</OptOutofPasswordPolicy> 
    </Constraints> 
    <Modules> 
     <Module registered="true" name="DV" id="1" /> 
     <Module registered="true" name="DP" id="2" /> 
     <Module registered="true" name="DCC" id="3" /> 
     <Module registered="false" name="DRE" id="4" /> 
    </Modules> 
    </Organization> 
</Licensing> 

一個XML文件,我想在我的C#代碼使用LINQ讀它,雖然我試圖繼LINQ本教程(http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples) ,我似乎無法訪問我想要的元素。例如,我將如何使用LINQ獲得20325的關鍵編號,500的Org編號,每個模塊的id/name/registered以及類似的東西? XML文檔必須採用這種格式。任何幫助或演練將不勝感激,謝謝!

編輯: 例如,我試着做

IEnumerable<XElement> Licensing = xelement.Elements(); 
    foreach (var Organization in Licensing) 
    { 
     System.Diagnostics.Debug.Write(Organization.Element("Constraints").Value); 
    } 

,看看這會給我的,它給29999991FALSE,我希望它會沿着

行給的東西
MaximumOrgsInSecurity 
MaximumUsersInSecurity 
MaximumLoggedInUsers 
MaximumLenders 
OptOutofPasswordPolicy 

或至少

2 
999 
999 
1 
False 

我也試着做

IEnumerable<XElement> Licensing = xelement.Elements(); 
    foreach (var Organization in Licensing) 
    { 
     System.Diagnostics.Debug.Write(Organization.Element("Modules").Value); 
    } 

,看看這會給的,它給絕對沒有。

如果還有比LINQ更好的方式來做到這一點,那麼我都是耳朵。我說LINQ的唯一原因是基於迄今爲止我發現的,LINQ將是我最好的選擇,以實現我正在嘗試做的事情。

+1

這不是教程網站。你有什麼嘗試過自己? –

+2

到目前爲止您嘗試過什麼?你說你試圖做到這一點,而不是在工作 - 你沒有得到什麼?一個例外?編譯錯誤?如果您沒有告訴我們您遇到問題的具體位置,我們無法幫助您學習! – Chris

+0

請參閱我的編輯。 – JDawg848

回答

1

這些鍵值被稱爲屬性,這裏是幾種不同的方式來訪問它們:

Debug.WriteLine(xelement.Attribute("key").Value); 

Debug.WriteLine(xelement.Element("Organization").Attribute("Org").Value); 
Debug.WriteLine(((XElement)xelement.FirstNode).Attribute("Org").Value); 

對於你選擇級別高的制約,需要.Elements()選擇子節點:

foreach (var constraint in xelement.Descendants("Constraints").Elements()) 
{ 
    Debug.WriteLine(constraint.Name + ": " + constraint.Value); 
} 

foreach (var constraint in xelement.Element("Organization").Element("Constraints").Elements()) 
{ 
    Debug.WriteLine(constraint.Name + ": " + constraint.Value); 
} 

您還可以將using System.Diagnostics;添加到文件的頂部,因此您無需在每次調試之前添加它。

0

因此,根據@mattmanser的說法,並進一步研究LINQ和Xelement/Xdocument,我想出瞭如何做我期望做的事情。

例如,假設我想知道所有的模塊元素中的「註冊」的布爾值,並將其存儲在布爾數組,身份證這樣做:

string Name = FileUpload1.FileName; 
bool[] ModuleBools = new bool[4]; 

for (int moduleID = 1; moduleID < 5; moduleID++) 
{ 
    var quotes = XDocument.Load("C:/Users/.../Created XMLs/" + Name) 
             .Descendants("Module") 
             .Where(x => (string)x.Attribute("id") == moduleID.ToString()) 
             .Select(x => (string)x.Attribute("registered")) 
             .ToList(); 

    ModuleBools[moduleID-1] = bool.Parse(quotes.First()); 
    } 
0

藉口VB。用給出的例子,這裏是你將如何訪問每個項目。變量名稱雖然與元素相同,但只是名稱。

Dim someXE As XElement 

    ' someXE = XElement.Load("path here") 'to load from file/uri 
    ' for testing we can do this 
    someXE = <Licensing key="20325"> 
       <Organization Org="500"> 
        <Constraints> 
         <MaximumOrgsInSecurity>2</MaximumOrgsInSecurity> 
         <MaximumUsersInSecurity>999</MaximumUsersInSecurity> 
         <MaximumLoggedInUsers>999</MaximumLoggedInUsers> 
         <MaximumLenders>1</MaximumLenders> 
         <OptOutofPasswordPolicy>FALSE</OptOutofPasswordPolicy> 
        </Constraints> 
        <Modules> 
         <Module registered="true" name="DV" id="1"/> 
         <Module registered="true" name="DP" id="2"/> 
         <Module registered="true" name="DCC" id="3"/> 
         <Module registered="false" name="DRE" id="4"/> 
        </Modules> 
       </Organization> 
      </Licensing> 

    Dim key As String = [email protected] 
    Dim MaximumOrgsInSecurity As String = someXE.<Organization>.<Constraints>.<MaximumOrgsInSecurity>.Value 
    Dim MaximumUsersInSecurity As String = someXE.<Organization>.<Constraints>.<MaximumOrgsInSecurity>.Value 
    Dim MaximumLoggedInUsers As String = someXE.<Organization>.<Constraints>.<MaximumLoggedInUsers>.Value 
    Dim MaximumLenders As String = someXE.<Organization>.<Constraints>.<MaximumLenders>.Value 
    Dim OptOutofPasswordPolicy As String = someXE.<Organization>.<Constraints>.<OptOutofPasswordPolicy>.Value 
相關問題