2013-05-27 95 views
0

屬性,我已經能夠創建使用LINQ一個XML文件,使用此代碼:讀取XML文件:從元素分析使用LINQ

XElement config = 
     new XElement("Configurations", 
     new XElement("configuration", 
      new XAttribute("mode", 1), 
      new XElement("Platform", 
       new XAttribute("name", "Device Portal")), 
      new XElement("IPConfigurations", 
       new XAttribute("IPmode", eS_IPsettings1.IPMode), 
       new XAttribute("IPAddress", eS_IPsettings1.IPAddress), 
       new XAttribute("NetMask", eS_IPsettings1.NetMask), 
       new XAttribute("GateWay", eS_IPsettings1.Gateway)), 
      new XElement("ProxyConfigurations", 
       new XAttribute("ProxyMode", eS_ProxySettings1.Enable), 
       new XAttribute("ProxyURL", eS_ProxySettings1.ProxyURL)), 
       new XElement("KeyLockConfigurations", 
        new XAttribute("KeyLockMode", eS_KeyLock1.Enable), 
        new XAttribute("Pin", eS_KeyLock1.Pin)) 
      ) 
     ); 

產生XML文件是這樣的:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Configurations> 
    <configuration mode="1"> 
    <Platform name="Device Portal" /> 
    <IPConfigurations IPmode="Keep existing" IPAddress="..." NetMask="..." GateWay="..." /> 
    <ProxyConfigurations ProxyMode="Keep existing" ProxyURL="Enter proxy URL here" /> 
    <KeyLockConfigurations KeyLockMode="Keep existing" Pin="" /> 
    </configuration> 
</Configurations> 

現在我想檢查configuration的屬性值,並且如果值爲1,我想要解析此配置中子元素的屬性值。這樣做的最佳方法是什麼?

我試過使用LoadXml,但我無法弄清楚如何使這項工作......我認爲讀取文件的最佳方式是使用LINQ,但我不知道如何。

回答

2

這可能是您正在尋找的聲明。

Config.Descendants("configuration").Where(xel=>xel.Attribute("mode").Value==1) 

根據處理的複雜程度,你可以考慮把它放在一個foreach循環中。 像這樣:

foreach (var element in Config.Descendants("configuration").Where(xel=>xel.Attribute("mode").Value==1)) 
{ 
    //handle element 
} 
+0

請問您能告訴我如何提取一個值,例如'IPMode'?據我所見,這看起來不錯! – 2pietjuh2

+0

啊,永遠不要,算出來。 string temp = element.Element(「IPConfigurations」)。Attribute(「IPmode」)。Value; – 2pietjuh2

0

假設XML是字符串中或這可以來自文件或任何其他流;你可以在XDocument中加載它並使用linq來查找你的節點和屬性。

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
    <Configurations> 
    <configuration mode=""1""> 
     <Platform name=""Device Portal"" /> 
     <IPConfigurations IPmode=""Keep existing"" IPAddress=""..."" NetMask=""..."" GateWay=""..."" /> 
     <ProxyConfigurations ProxyMode=""Keep existing"" ProxyURL=""Enter proxy URL here"" /> 
     <KeyLockConfigurations KeyLockMode=""Keep existing"" Pin="""" /> 
    </configuration> 
</Configurations>"; 

    using (var strm = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml))) 
    { 
     var doc = XDocument.Load(strm); 
     var configs = doc.Nodes() 
      .Where(x => (x is XElement) && ((XElement)x).Name == "Configurations") 
      .Cast<XElement>(); 

     var firstConfig = configs 
      .FirstOrDefault() 
      .Nodes() 
      .FirstOrDefault(x => (x is XElement) && ((XElement)x).Name == "configuration") 
      as XElement; 

     var mode = firstConfig.Attributes().FirstOrDefault(a => a.Name == "mode"); 
     //mode now has Value of "1". 
     //access it as mode.Value 
    }