Linq to XML:查找特定元素的值

时间:2011-05-23 16:02:30

标签: linq linq-to-xml

我是“Linq”和“Linq to XML”概念的新宠。我有以下xml树

<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>IWS</name>
<SSIDConfig>
  <SSID>
    <hex>496153</hex>
    <name>ISL</name>
  </SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<MSM>
  <security>
    <authEncryption>
      <authentication>WPA2PSK</authentication>
      <encryption>AES</encryption>
      <useOneX>false</useOneX>
    </authEncryption>
    <sharedKey>
      <keyType>networkKey</keyType>
      <protected>false</protected>  
      <keyMaterial>BFEBBEA9B0E78ECD671A8D35D96556A32E001B7524A1</keyMaterial>
   </sharedKey>
 </security>
</MSM>
</WLANProfile>

我想知道如何使用linq to xml检索KeyMaterial元素值?

我尝试使用以下代码,但我得到空枚举

var networkKey = from c in doc.Descendants("WLANProfile")
                 select (string)c.Element("keyMaterial").Value;

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

两个错误:

1。)keyMaterial不是WLANProfile的直接孩子,这就是为什么你没有得到任何结果(c。元素只会寻找直接的孩子)

2。)您需要在XML中使用指定的命名空间 - 否则没有节点匹配

两者都适用:

XNamespace xns = "http://www.microsoft.com/networking/WLAN/profile/v1";
var networkKey = (from c in doc.Descendants(xns + "keyMaterial")
                  select (string)c.Value).FirstOrDefault();

如果你知道总是只有一个键,那么点符号会稍微短一些:

string networkKey = xdoc.Descendants(xns + "keyMaterial").Single().Value;