Linq-to-XML query to select specific sub-element based on additional criteria
Posted
by BrianLy
on Stack Overflow
See other posts from Stack Overflow
or by BrianLy
Published on 2010-03-22T00:48:22Z
Indexed on
2010/03/22
0:51 UTC
Read the original article
Hit count: 569
My current LINQ query and example XML are below. What I'd like to do is select the primary email address from the email-addresses element into the User.Email property. The type element under the email-address element is set to primary when this is true. There may be more than one element under the email-addresses but only one will be marked primary.
What is the simplest approach to take here?
Current Linq Query (User.Email is currently empty):
var users = from response in xdoc.Descendants("response")
where response.Element("id") != null
select new User
{
Id = (string)response.Element("id"),
Name = (string)response.Element("full-name"),
Email = (string)response.Element("email-addresses"),
JobTitle = (string)response.Element("job-title"),
NetworkId = (string)response.Element("network-id"),
Type = (string)response.Element("type")
};
Example XML:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<response>
<contact>
<phone-numbers/>
<im>
<provider></provider>
<username></username>
</im>
<email-addresses>
<email-address>
<type>primary</type>
<address>[email protected]</address>
</email-address>
</email-addresses>
</contact>
<job-title>Account Manager</job-title>
<type>user</type>
<expertise nil="true"></expertise>
<summary nil="true"></summary>
<kids-names nil="true"></kids-names>
<location nil="true"></location>
<guid nil="true"></guid>
<timezone>Eastern Time (US & Canada)</timezone>
<network-name>Domain</network-name>
<full-name>Alice</full-name>
<network-id>79629</network-id>
<stats>
<followers>2</followers>
<updates>4</updates>
<following>3</following>
</stats>
<mugshot-url>
https://assets3.yammer.com/images/no_photo_small.gif</mugshot-url>
<previous-companies/>
<birth-date></birth-date>
<name>alice</name>
<web-url>https://www.yammer.com/domain.com/users/alice</web-url>
<interests nil="true"></interests>
<state>active</state>
<external-urls/>
<url>https://www.yammer.com/api/v1/users/1089943</url>
<network-domains>
<network-domain>domain.com</network-domain>
</network-domains>
<id>1089943</id>
<schools/>
<hire-date nil="true"></hire-date>
<significant-other nil="true"></significant-other>
</response>
<response>
<contact>
<phone-numbers/>
<im>
<provider></provider>
<username></username>
</im>
<email-addresses>
<email-address>
<type>primary</type>
<address>[email protected]</address>
</email-address>
</email-addresses>
</contact>
<job-title>Office Manager</job-title>
<type>user</type>
<expertise nil="true"></expertise>
<summary nil="true"></summary>
<kids-names nil="true"></kids-names>
<location nil="true"></location>
<guid nil="true"></guid>
<timezone>Eastern Time (US & Canada)</timezone>
<network-name>Domain</network-name>
<full-name>Bill</full-name>
<network-id>79629</network-id>
<stats>
<followers>3</followers>
<updates>1</updates>
<following>1</following>
</stats>
<mugshot-url>
https://assets3.yammer.com/images/no_photo_small.gif</mugshot-url>
<previous-companies/>
<birth-date></birth-date>
<name>bill</name>
<web-url>https://www.yammer.com/domain.com/users/bill</web-url>
<interests nil="true"></interests>
<state>active</state>
<external-urls/>
<url>https://www.yammer.com/api/v1/users/1089920</url>
<network-domains>
<network-domain>domain.com</network-domain>
</network-domains>
<id>1089920</id>
<schools/>
<hire-date nil="true"></hire-date>
<significant-other nil="true"></significant-other>
</response>
</response>
© Stack Overflow or respective owner