XDocument Multiple Elements with same name - c#

In an XML document, I have 3 different elements, all named "time". How do I select the third element in this XML document? (that is named time) Doing this only selects the first one:
xDoc.Root.Element("forecast").Element("time").Element("temperature").Attribute("day").Value
By the way, the XML elements named "Time" have different dates attached to them via attribute "Day", if that is any use.
<time day="2013-12-23">
</time>
<time day="2013-12-24">
</time>
Whole XML per request:
<weatherdata>
<location>
<name>London</name>
<type/>
<country>GB</country>
<timezone/>
<location altitude="0" latitude="51.50853" longitude="-0.12574" geobase="geonames" geobaseid="0"/>
</location>
<credit/>
<meta>
<lastupdate/>
<calctime>0.0036</calctime>
<nextupdate/>
</meta>
<sun rise="2013-12-24T08:05:11" set="2013-12-24T15:55:37"/>
<forecast>
<time day="2013-12-23">
<symbol number="501" name="moderate rain" var="10d"/>
<precipitation value="4" type="rain"/>
<windDirection deg="205" code="SSW" name="South-southwest"/>
<windSpeed mps="13.66" name="Strong breeze"/>
<temperature day="11.22" min="11.22" max="11.43" night="11.43" eve="11.22" morn="11.22"/>
<pressure unit="hPa" value="989.46"/>
<humidity value="94" unit="%"/>
<clouds value="overcast clouds" all="92" unit="%"/>
</time>
<time day="2013-12-24">
<symbol number="501" name="moderate rain" var="10d"/>
<precipitation value="8.5" type="rain"/>
<windDirection deg="216" code="SW" name="Southwest"/>
<windSpeed mps="9.26" name="Fresh Breeze"/>
<temperature day="9.79" min="6.09" max="10.36" night="6.43" eve="6.09" morn="10.36"/>
<pressure unit="hPa" value="984.45"/>
<humidity value="97" unit="%"/>
<clouds value="overcast clouds" all="92" unit="%"/>
</time>
<time day="2013-12-25">
<symbol number="500" name="light rain" var="10d"/>
<precipitation value="1" type="rain"/>
<windDirection deg="162" code="SSE" name="South-southeast"/>
<windSpeed mps="4.31" name="Gentle Breeze"/>
<temperature day="7.23" min="4.15" max="7.65" night="5.4" eve="6.98" morn="4.15"/>
<pressure unit="hPa" value="986.23"/>
<humidity value="100" unit="%"/>
<clouds value="scattered clouds" all="32" unit="%"/>
</time>
<time day="2013-12-26">
<symbol number="802" name="scattered clouds" var="03d"/>
<precipitation/>
<windDirection deg="253" code="WSW" name="West-southwest"/>
<windSpeed mps="8.77" name="Fresh Breeze"/>
<temperature day="6.41" min="3.7" max="6.84" night="4.68" eve="5.06" morn="4.86"/>
<pressure unit="hPa" value="993.13"/>
<humidity value="92" unit="%"/>
<clouds value="scattered clouds" all="48" unit="%"/>
</time>
<time day="2013-12-27">
<symbol number="501" name="moderate rain" var="10d"/>
<precipitation value="6" type="rain"/>
<windDirection deg="208" code="SSW" name="South-southwest"/>
<windSpeed mps="13.51" name="Strong breeze"/>
<temperature day="10.34" min="7.8" max="11.04" night="7.8" eve="8.81" morn="10.59"/>
<pressure unit="hPa" value="977.27"/>
<humidity value="93" unit="%"/>
<clouds value="scattered clouds" all="32" unit="%"/>
</time>
<time day="2013-12-28">
<symbol number="800" name="sky is clear" var="01d"/>
<precipitation/>
<windDirection deg="261" code="W" name="West"/>
<windSpeed mps="3.47" name="Gentle Breeze"/>
<temperature day="7.92" min="2.36" max="7.92" night="2.36" eve="3.82" morn="7.02"/>
<pressure unit="hPa" value="1000.76"/>
<humidity value="82" unit="%"/>
<clouds value="sky is clear" all="0" unit="%"/>
</time>
<time day="2013-12-29">
<symbol number="500" name="light rain" var="10d"/>
<precipitation value="0.46" type="rain"/>
<windDirection deg="263" code="W" name="West"/>
<windSpeed mps="6.9" name="Moderate breeze"/>
<temperature day="9.13" min="8" max="10.41" night="10.41" eve="8.79" morn="8"/>
<pressure unit="hPa" value="1013.2"/>
<humidity value="0" unit="%"/>
<clouds value="few clouds" all="17" unit="%"/>
</time>
</forecast>
</weatherdata>

Get the value from the third "time" element in your XML:
xDoc.Root.Element("forecast")
.Elements("time")
.Skip(2).First()
.Element("temperature")
.Attribute("day")
.Value;
Or if you prefer to search by the date (more reliable):
xDoc.Root.Element("forecast")
.Elements("time")
.Single(x => x.Attribute("day").Value == "2013-12-25")
.Element("temperature")
.Attribute("day")
.Value;
If there's any chance you could be searching for a date that exists multiple times in the file, you'll need First as Single blows up if there's more than a single record.
If there's any chance of searching for a date that doesn't exist in your XML at all, look into SingleOrDefault or FirstOrDefault, as those return null if the record doesn't exist instead of throwing an exception. If that's the case, you'll need to split the above query into two parts, testing for null before trying to get the day's temperature.

Using your XML Sample, this is what you can do to obtain only the third element.
IEnumerable<XElement> times = (
from item in xDoc.Root.Element("forecast").Elements("time")
select item).Skip(2).Take(1);
foreach (XElement el in times)
Console.WriteLine(el);
Hope this helps

Related

Delete data in XML with C#

I have the following XML File:
<order id="1234">
<users>
<user id="102030" nick="nickname" done="false" />
<user id="123456" nick="nickname" done="false" />
</users>
<machines>
<machine id="123" sd="123" ref="" done="false" />
<machine id="456" sd="456" ref="" done="false" />
<machine id="789" sd="789" ref="" done="false" />
</machines>
</order>
I want to delete the user with the id 102030, so the xml looks like this:
<users>
<user id="123456" nick="nickname" done="false" />
</users>
<machines>
<machine id="123" sd="123" ref="" done="false" />
<machine id="456" sd="456" ref="" done="false" />
<machine id="789" sd="789" ref="" done="false" />
</machines>
</order>
This is my code which doesn't work:
XmlDocument doc = XmlDocument.Load(path);
XmlNodeList nodes = doc.GetElementsByTagName("users");
foreach(XmlNode node in nodes){
foreach(XmlAttribute attribute in node.Attributes){
if(attribute.Name== "id" && attribute.Value == "102030"){
node.RemoveAll();
}
}
}
doc.Save(path);
I am a newbie in C# so I need every help!
Thanks in advance, geibi
XmlNode.RemoveAll() does not remove a node. Instead it:
Removes all the child nodes and/or attributes of the current node.
Thus, instead you need to remove the node from its parent:
node.ParentNode.RemoveChild(node);

Bind XML nested node Data into Repeater Control in ASP.NET

I have consume openweathermap API in xml format. In this XML data node are nested and unordered. I don't know how to bind data in repeater control.
Here is my C# code
using System.Net;
protected void GetWeatherInfo()
{
string appId = "API KEY";
string url = string.Format("http://api.openweathermap.org/data/2.5/forecast/daily?q=London&units=metric&mode=xml&cnt=2&APPID={0}", appId);
using (WebClient client = new WebClient())
{
string xmlData= client.DownloadString(url);
RepDetails.DataSource = xmlData;
RepDetails.DataBind();
}
}
Coming data from url
<weatherdata>
- <location>
<name>London</name>
<type />
<country>GB</country>
<timezone />
<location altitude="0" latitude="51.50853" longitude="-0.12574" geobase="geonames" geobaseid="2643743" />
</location>
<credit />
- <meta>
<lastupdate />
<calctime>0.0278</calctime>
<nextupdate />
</meta>
<sun rise="2015-12-16T08:00:32" set="2015-12-16T15:51:44" />
- <forecast>
- <time day="2015-12-16">
<symbol number="500" name="light rain" var="10d" />
<precipitation value="1.22" type="rain" />
<windDirection deg="250" code="WSW" name="West-southwest" />
<windSpeed mps="8.54" name="Fresh Breeze" />
<temperature day="13.11" min="12.09" max="13.2" night="12.22" eve="13.02" morn="12.63" />
<pressure unit="hPa" value="1023.73" />
<humidity value="94" unit="%" />
<clouds value="broken clouds" all="64" unit="%" />
</time>
- <time day="2015-12-17">
<symbol number="500" name="light rain" var="10d" />
<precipitation value="0.5" type="rain" />
<windDirection deg="199" code="SSW" name="South-southwest" />
<windSpeed mps="7.17" name="Moderate breeze" />
<temperature day="12.86" min="11.16" max="12.87" night="11.16" eve="12.48" morn="11.61" />
<pressure unit="hPa" value="1019.9" />
<humidity value="89" unit="%" />
<clouds value="broken clouds" all="68" unit="%" />
</time>
</forecast>
</weatherdata>
So, according to my requirement i need sun and time node data but i don't know how to manage relationship between parent and child node data in repeater control.
<itemTemplate>
<asp:Label ID="lblDate" runat="server" Text='<%#Eval("sun.rise") %>' Font-Bold="true" />
<asp:Label ID="lblComment" runat="server" Text='<%#Eval("time.temprature.day") %>' />
</itemTemplate>

How can I select all subnodes of a node, and not all descendats?

I've got the following XML:
<...>
<...>
<tabular>
<time from="2014-05-22T10:00:00" to="2014-05-22T12:00:00" period="1">
<symbol number="3" numberEx="3" var="03d" />
<precipitation value="0" />
<windDirection deg="191.8" code="SSW" />
<windSpeed mps="1.3" />
<temperature unit="celsius" value="16" />
<pressure unit="hPa" value="1010.6" />
</time>
<time from="2014-05-22T10:00:00" to="2014-05-22T12:00:00" period="1">
<symbol number="3" numberEx="3" var="03d" />
<precipitation value="0" />
<windDirection deg="191.8" code="SSW" />
<windSpeed mps="1.3" />
<temperature unit="celsius" value="16" />
<pressure unit="hPa" value="1010.6" />
</time>
<time from="2014-05-22T10:00:00" to="2014-05-22T12:00:00" period="1">
<symbol number="3" numberEx="3" var="03d" />
<precipitation value="0" />
<windDirection deg="191.8" code="SSW" />
<windSpeed mps="1.3" />
<temperature unit="celsius" value="16" />
<pressure unit="hPa" value="1010.6" />
</time>
I've managed with LINQ to get the tabular list:
var tabular = doc.Root.Descendants("tabular").ToList();
tabular count is now 1. What I want is a list of children of tabular. I've tried the extra descendant:
var tabular = doc.Root.Descendants("tabular").Descendants().ToList();
But that return a list of every descendant of tabular, resulting in a list where time, symbol, precipitation and so on is in the list. How can I get a list where the list contains time nodes of tabular?
I want a list of all time nodes, so I can serialize it to a object and access the values
Use Elements instead of Descendants if you want to get only direct children of tabular
var tabular = doc.Root.Descendants("tabular").Elements().ToList();
UPDATE: Hints for parsing time elements into objects
var times =
from t in xdoc.Descendants("tabular").Elements()
let symbol = t.Element("symbol")
let temperature = t.Element("temperature")
select new
{
From = (DateTime)t.Attribute("from"),
To = (DateTime)t.Attribute("to"),
Period = (int)t.Attribute("period"),
Symbol = new
{
Number = (int)symbol.Attribute("number"),
NumberEx = (int)symbol.Attribute("numberEx"),
Var = (string)symbol.Attribute("var")
},
Precipitation = (int)t.Element("precipitation").Attribute("value"),
WindSpeed = (double)t.Element("windSpeed").Attribute("mps"),
Temperature = new
{
Unit = (string)temperature.Attribute("unit"),
Value = (string)temperature.Attribute("value")
}
};
Output:
[
{
From: "2014-05-22T10:00:00",
To: "2014-05-22T12:00:00",
Period: 1,
Symbol: { Number: 3, NumberEx: 3, Var: "03d" },
Precipitation: 0,
WindSpeed: 1.3,
Temperature: { Unit: "celsius", Value: "16" }
},
// ...
]

How to Read XElement contents containing Sharepoint List Structure?

I want to bind the MultipleCheckbox items from Choice Column of sharepoint List to asp.net CheckBoxListItem using c#.
I am retriving information of List using XELEMENT as:
In .cs file:
XElement listStructure;
listStructure = proxy.GetList("WebsiteSubscriber");
here am getting XML as:
<List DocTemplateUrl="" DefaultViewUrl="/Lists/WebsiteSubscriber/AllItems.aspx" MobileDefaultViewUrl="" ID="{2C8A80EA-38C5-48F7-9D7D-400D445A5E64}" Title="WebsiteSubscriber" Description="" ImageUrl="/_layouts/images/itgen.png" Name="{2C8A80EA-38C5-48F7-9D7D-400D445A5E64}" BaseType="0" FeatureId="00bfea71-de22-43b2-a848-c05709900100" ServerTemplate="100" Created="20130417 02:18:11" Modified="20130424 09:27:11" LastDeleted="20130419 04:46:25" Version="5" Direction="none" ThumbnailSize="" WebImageWidth="" WebImageHeight="" Flags="545263616" ItemCount="13" AnonymousPermMask="0" RootFolder="/Lists/WebsiteSubscriber" ReadSecurity="1" WriteSecurity="1" Author="8" EventSinkAssembly="" EventSinkClass="" EventSinkData="" EmailAlias="" WebFullUrl="/" WebId="198e057a-38e8-410a-8358-ed95f77d18ea" SendToLocation="" ScopeId="e2cbf2fd-93e4-408d-bd4e-320321734b8c" MajorVersionLimit="0" MajorWithMinorVersionsLimit="0" WorkFlowId="" HasUniqueScopes="False" NoThrottleListOperations="False" HasRelatedLists="" AllowDeletion="True" AllowMultiResponses="False" EnableAttachments="True" EnableModeration="False" EnableVersioning="False" HasExternalDataSource="False" Hidden="False" MultipleDataList="False" Ordered="False" ShowUser="True" EnablePeopleSelector="False" EnableResourceSelector="False" EnableMinorVersion="False" RequireCheckout="False" ThrottleListOperations="False" ExcludeFromOfflineClient="False" EnableFolderCreation="False" IrmEnabled="False" IsApplicationList="False" PreserveEmptyValues="False" StrictTypeCoercion="False" EnforceDataValidation="False" MaxItemsPerThrottledOperation="100000" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<Fields>
<Field ID="{03e45e84-1992-4d42-9116-26f756012634}" RowOrdinal="0" Type="ContentTypeId" Sealed="TRUE" ReadOnly="TRUE" Hidden="TRUE" DisplayName="Content Type ID" Name="ContentTypeId" DisplaceOnUpgrade="TRUE" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="ContentTypeId" ColName="tp_ContentTypeId" FromBaseType="TRUE" />
<Field ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="Title" Group="Base Columns" Type="Text" DisplayName="Title" Required="FALSE" FromBaseType="TRUE" EnforceUniqueValues="FALSE" Indexed="FALSE" MaxLength="255" Version="1" ColName="nvarchar1" RowOrdinal="0" />
<Field ID="{34ad21eb-75bd-4544-8c73-0e08330291fe}" ReadOnly="TRUE" Type="Note" Name="_ModerationComments" DisplayName="Approver Comments" Hidden="TRUE" CanToggleHidden="TRUE" Filterable="FALSE" Sortable="FALSE" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="_ModerationComments" FromBaseType="TRUE" ColName="ntext1" />
<Field ID="{bc91a437-52e7-49e1-8c4e-4698904b2b6d}" ReadOnly="TRUE" Type="Computed" Name="LinkTitleNoMenu" DisplayName="Title" Dir="" DisplayNameSrcField="Title" AuthoringInfo="(linked to item)" EnableLookup="TRUE" ListItemMenuAllowed="Prohibited" LinkToItemAllowed="Prohibited" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="LinkTitleNoMenu" FromBaseType="TRUE">
<FieldRefs>
<FieldRef Name="Title" />
<FieldRef Name="LinkFilenameNoMenu" />
</FieldRefs>
<DisplayPattern>
<IfEqual>
<Expr1>
<LookupColumn Name="FSObjType" />
</Expr1>
<Expr2>1</Expr2>
<Then>
<Field Name="LinkFilenameNoMenu" />
</Then>
<Else>
<HTML><![CDATA[<a onfocus="OnLink(this)" href="]]></HTML>
<URL />
<HTML><![CDATA[" onclick="EditLink2(this,]]></HTML>
<Counter Type="View" />
<HTML><![CDATA[);return false;" target="_self">]]></HTML>
<Column HTMLEncode="TRUE" Name="Title" Default="(no title)" />
<IfEqual>
<Expr1>
<GetVar Name="ShowAccessibleIcon" />
</Expr1>
<Expr2>1</Expr2>
<Then>
<HTML><![CDATA[<img src="/_layouts/images/blank.gif" class="ms-hidden" border="0" width="1" height="1" alt="Use SHIFT+ENTER to open the menu (new window)."/>]]></HTML>
</Then>
</IfEqual>
<HTML><![CDATA[</a>]]></HTML>
<IfNew>
<HTML><![CDATA[<img src="/_layouts/1033/images/new.gif" alt="]]></HTML>
<HTML>New</HTML>
<HTML><![CDATA[" class="ms-newgif" />]]></HTML>
</IfNew>
</Else>
</IfEqual>
</DisplayPattern>
</Field>
<Field ID="{82642ec8-ef9b-478f-acf9-31f7d45fbc31}" ReadOnly="TRUE" Type="Computed" Name="LinkTitle" DisplayName="Title" DisplayNameSrcField="Title" ClassInfo="Menu" AuthoringInfo="(linked to item with edit menu)" ListItemMenuAllowed="Required" LinkToItemAllowed="Prohibited" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="LinkTitle" FromBaseType="TRUE">
<FieldRefs>
<FieldRef Name="Title" />
<FieldRef Name="LinkTitleNoMenu" />
<FieldRef Name="_EditMenuTableStart2" />
<FieldRef Name="_EditMenuTableEnd" />
</FieldRefs>
<DisplayPattern>
<FieldSwitch>
<Expr>
<GetVar Name="FreeForm" />
</Expr>
<Case Value="TRUE">
<Field Name="LinkTitleNoMenu" />
</Case>
<Default>
<Switch>
<Expr>
<GetVar Name="MasterVersion" />
</Expr>
<Case Value="4">
<HTML><![CDATA[<div class="ms-vb itx" onmouseover="OnItem(this)" CTXName="ctx]]></HTML>
<Field Name="_EditMenuTableStart2" />
<HTML><![CDATA[">]]></HTML>
<Field Name="LinkTitleNoMenu" />
<HTML><![CDATA[</div>]]></HTML>
<HTML><![CDATA[<div class="s4-ctx" onmouseover="OnChildItem(this.parentNode); return false;">]]></HTML>
<HTML><![CDATA[<span> </span>]]></HTML>
<HTML><![CDATA[<a onfocus="OnChildItem(this.parentNode.parentNode); return false;" onclick="PopMenuFromChevron(event); return false;" href="javascript:;" title="Open Menu"></a>]]></HTML>
<HTML><![CDATA[<span> </span>]]></HTML>
<HTML><![CDATA[</div>]]></HTML>
</Case>
<Default>
<HTML><![CDATA[<table height="100%" cellspacing="0" class="ms-unselectedtitle itx" onmouseover="OnItem(this)" CTXName="ctx]]></HTML>
<Field Name="_EditMenuTableStart2" />
<HTML><![CDATA["><tr><td width="100%" class="ms-vb">]]></HTML>
<SetVar Name="ShowAccessibleIcon" Value="1" />
<Field Name="LinkTitleNoMenu" />
<SetVar Name="ShowAccessibleIcon" Value="0" />
<HTML><![CDATA[</td><td><img src="/_layouts/images/blank.gif" width="13" style="visibility:hidden" alt=""/></td></tr></table>]]></HTML>
</Default>
</Switch>
</Default>
</FieldSwitch>
</DisplayPattern>
</Field>
<Field ID="{5f190d91-3dbc-4489-9878-3c092caf35b6}" Hidden="TRUE" ReadOnly="TRUE" Type="Computed" Name="LinkTitle2" DisplayName="Title" DisplayNameSrcField="Title" ClassInfo="Menu" AuthoringInfo="(linked to item with edit menu) (old)" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="LinkTitle2" FromBaseType="TRUE">
<FieldRefs>
<FieldRef Name="Title" />
<FieldRef Name="LinkTitleNoMenu" />
<FieldRef Name="_EditMenuTableStart" />
<FieldRef Name="_EditMenuTableEnd" />
</FieldRefs>
<DisplayPattern>
<FieldSwitch>
<Expr>
<GetVar Name="FreeForm" />
</Expr>
<Case Value="TRUE">
<Field Name="LinkTitleNoMenu" />
</Case>
<Default>
<Field Name="_EditMenuTableStart" />
<SetVar Name="ShowAccessibleIcon" Value="1" />
<Field Name="LinkTitleNoMenu" />
<SetVar Name="ShowAccessibleIcon" Value="0" />
<Field Name="_EditMenuTableEnd" />
</Default>
</FieldSwitch>
</DisplayPattern>
</Field>
<Field ID="{39360f11-34cf-4356-9945-25c44e68dade}" ReadOnly="TRUE" Hidden="TRUE" Type="Text" Name="File_x0020_Type" DisplaceOnUpgrade="TRUE" DisplayName="File Type" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="File_x0020_Type" FromBaseType="TRUE" ColName="nvarchar2" />
<Field Type="Text" DisplayName="Email" Required="FALSE" EnforceUniqueValues="FALSE" Indexed="FALSE" MaxLength="255" ID="{bf605e59-6807-47de-87ac-617b2c8df00b}" SourceID="{2c8a80ea-38c5-48f7-9d7d-400d445a5e64}" StaticName="Email" Name="Email" ColName="nvarchar3" RowOrdinal="0" />
<Field Type="MultiChoice" DisplayName="Area" Required="FALSE" EnforceUniqueValues="FALSE" Indexed="FALSE" FillInChoice="FALSE" ID="{16cc1615-a490-44de-a870-c7ebe603e2cc}" SourceID="{2c8a80ea-38c5-48f7-9d7d-400d445a5e64}" StaticName="Area" Name="Area" ColName="ntext2" RowOrdinal="0">
<Default>Articles</Default>
**<CHOICES>
<CHOICE>Articles</CHOICE>
<CHOICE>Websites</CHOICE>
<CHOICE>Books</CHOICE>
</CHOICES>**
</Field>
<Field ID="{1d22ea11-1e32-424e-89ab-9fedbadb6ce1}" ColName="tp_ID" RowOrdinal="0" ReadOnly="TRUE" Type="Counter" Name="ID" PrimaryKey="TRUE" DisplayName="ID" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="ID" FromBaseType="TRUE" />
<Field ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Type="Computed" DisplayName="Content Type" Name="ContentType" DisplaceOnUpgrade="TRUE" RenderXMLUsingPattern="TRUE" Sortable="FALSE" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="ContentType" Group="_Hidden" PITarget="MicrosoftWindowsSharePointServices" PIAttribute="ContentTypeID" FromBaseType="TRUE">
I want to get above values following from XML.
<CHOICES>
<CHOICE>Articles</CHOICE>
<CHOICE>Websites</CHOICE>
<CHOICE>Books</CHOICE>
</CHOICES>
Provided you fix your XML, this does what you want:
var choices = (from n in xml.Descendants()
where n.Name.LocalName == "CHOICES"
select new
{
CHOICES = n.Elements().Select(x => x.Value).ToList()
}).ToList();
Will give you a list of the anonymous type CHOICES elements that contain your CHOICE element values. Example output:
Edit
See comments:
var choices = (from n in xml.Descendants()
where n.Name.LocalName == "CHOICE"
select n.Value).ToList();
This will return a list of the following string values:
Articles
Websites
Books
0;#Approved
1;#Rejected
2;#Pending
3;#Draft
4;#Scheduled

Linq/XML: grouping results properly within XML element

OK, I asked for how to return a Linq query results as XML, and I got the answer here.
But there's one little problem: the results do not get grouped logically within the XML. For example:
XElement xml = new XElement("States",
from s in MyStates
from cy in s.Counties
from c in cy.Cities
where s.Code == "NY"
orderby s.Code, cy.Name, c.Name
select new XElement("State",
new XAttribute("Code", s.Code),
new XAttribute("Name", s.Name),
new XElement("County",
new XAttribute("Name", cy.Name),
new XElement("City",
new XAttribute("Name", c.Name)
)
)
)
);
Console.WriteLine(xml);
The output is of the form:
<State Code="NY" Name="New York ">
<County Name="WYOMING">
<City Name="WARSAW" />
</County>
</State>
<State Code="NY" Name="New York ">
<County Name="WYOMING">
<City Name="WYOMING" />
</County>
</State>
<State Code="NY" Name="New York ">
<County Name="YATES">
<City Name="BELLONA" />
</County>
</State>
<State Code="NY" Name="New York ">
<County Name="YATES">
<City Name="MIDDLESEX" />
</County>
</State>
<State Code="NY" Name="New York ">
<County Name="YATES">
<City Name="PENN YAN" />
</County>
</State>
<State Code="NY" Name="New York ">
<County Name="YATES">
<City Name="RUSHVILLE" />
</County>
</State>
instead of:
<State Code="NY" Name="New York ">
<County Name="WYOMING">
<City Name="WARSAW" />
<City Name="WYOMING" />
</County>
<County Name="YATES">
<City Name="BELLONA" />
<City Name="MIDDLESEX" />
<City Name="PENN YAN" />
<City Name="RUSHVILLE" />
</County>
</State>
How do I get the results to appear as desired?
To get the results you want, I believe you'll have to nest LINQ to XML queries. On the outer query, you'll have to query for distinct states...then an inner query to get the counties for that state...then another inner query to get the cities for that county.

Categories