Linq to XML: поиск значения определенного элемента - PullRequest
1 голос
/ 23 мая 2011

Я новичок в понятиях "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>

Мне было интересно, как получить значение элемента KeyMaterial, используя linq to xml?

Я пытался использовать следующий код, но получаю пустое перечисление

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

Есть предложения?

1 Ответ

4 голосов
/ 23 мая 2011

Две ошибки:

1.) keyMaterial не является прямым потомком WLANProfile, поэтому вы не получите никаких результатов (c.Elements будет искать только прямого потомка)

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...