Sorting of XContainer based on attribute value
Can any one help me to sort the XmlDocument based on attribute value.
I have given a sample xml having few attr elements. So I want to sort it based on "value" attribute of elements having attribute Name="from" I am trying to achieve this using linq to xml.
Here is one sample code I tried. But it is retaining only the "from" attributes in sorted order. I want all the attributes as shown below under expected xml.
container.ReplaceNodes(
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl
);
foreach (XElement childEl in container.Elements().Where(e => e.HasElements))
{
SortByName(childEl);
}
Input XML:
`<Attrs>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
Expected output:
`<?xml version="1.0" encoding="utf-8"?>
<Attrs>
<Attr <Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
c# linq-to-xml
add a comment |
Can any one help me to sort the XmlDocument based on attribute value.
I have given a sample xml having few attr elements. So I want to sort it based on "value" attribute of elements having attribute Name="from" I am trying to achieve this using linq to xml.
Here is one sample code I tried. But it is retaining only the "from" attributes in sorted order. I want all the attributes as shown below under expected xml.
container.ReplaceNodes(
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl
);
foreach (XElement childEl in container.Elements().Where(e => e.HasElements))
{
SortByName(childEl);
}
Input XML:
`<Attrs>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
Expected output:
`<?xml version="1.0" encoding="utf-8"?>
<Attrs>
<Attr <Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
c# linq-to-xml
add a comment |
Can any one help me to sort the XmlDocument based on attribute value.
I have given a sample xml having few attr elements. So I want to sort it based on "value" attribute of elements having attribute Name="from" I am trying to achieve this using linq to xml.
Here is one sample code I tried. But it is retaining only the "from" attributes in sorted order. I want all the attributes as shown below under expected xml.
container.ReplaceNodes(
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl
);
foreach (XElement childEl in container.Elements().Where(e => e.HasElements))
{
SortByName(childEl);
}
Input XML:
`<Attrs>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
Expected output:
`<?xml version="1.0" encoding="utf-8"?>
<Attrs>
<Attr <Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
c# linq-to-xml
Can any one help me to sort the XmlDocument based on attribute value.
I have given a sample xml having few attr elements. So I want to sort it based on "value" attribute of elements having attribute Name="from" I am trying to achieve this using linq to xml.
Here is one sample code I tried. But it is retaining only the "from" attributes in sorted order. I want all the attributes as shown below under expected xml.
container.ReplaceNodes(
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl
);
foreach (XElement childEl in container.Elements().Where(e => e.HasElements))
{
SortByName(childEl);
}
Input XML:
`<Attrs>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
Expected output:
`<?xml version="1.0" encoding="utf-8"?>
<Attrs>
<Attr <Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2016-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
<Attr Name="addressprevious" isVerified="false">
<Attr Name="from" Value="2015-01-01" isVerified="false" />
<Attr Name="house" Value="1" isVerified="false" />
<Attr Name="street" Value="Acacia Avenue" isVerified="false" />
</Attr>
<Attr Name="zddressprevious" isVerified="false">
<Attr Name="from" Value="2014-01-01" isVerified="false" />
<Attr Name="house" Value="3" isVerified="false" />
<Attr Name="street" Value="Test Street" isVerified="false" />
</Attr>
</Attrs>`
c# linq-to-xml
c# linq-to-xml
asked Nov 22 '18 at 8:06
17CrazyBrain17CrazyBrain
38313
38313
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Your LINQ
statement has to return the parent element (of the one containing the from-attribute) via childEl.Parent
.
From your question is not completely clear whether your container is an XDocument
or an XElement
.
In case of an XElement
the LINQ
statement looks like:
var q =
from childEl in container.Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and the replace as:
container.ReplaceNodes(q);
Note that the LINQ
statement without explicitly specifying the Attr
element names will also do the job:
var q =
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
In case of an XDocument
your query must look like:
var q =
from childEl in container.Element("Attrs").Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and you have to replace the nodes via:
container.Element("Attrs").ReplaceAll(q);
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53426363%2fsorting-of-xcontainer-based-on-attribute-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Your LINQ
statement has to return the parent element (of the one containing the from-attribute) via childEl.Parent
.
From your question is not completely clear whether your container is an XDocument
or an XElement
.
In case of an XElement
the LINQ
statement looks like:
var q =
from childEl in container.Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and the replace as:
container.ReplaceNodes(q);
Note that the LINQ
statement without explicitly specifying the Attr
element names will also do the job:
var q =
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
In case of an XDocument
your query must look like:
var q =
from childEl in container.Element("Attrs").Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and you have to replace the nodes via:
container.Element("Attrs").ReplaceAll(q);
add a comment |
Your LINQ
statement has to return the parent element (of the one containing the from-attribute) via childEl.Parent
.
From your question is not completely clear whether your container is an XDocument
or an XElement
.
In case of an XElement
the LINQ
statement looks like:
var q =
from childEl in container.Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and the replace as:
container.ReplaceNodes(q);
Note that the LINQ
statement without explicitly specifying the Attr
element names will also do the job:
var q =
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
In case of an XDocument
your query must look like:
var q =
from childEl in container.Element("Attrs").Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and you have to replace the nodes via:
container.Element("Attrs").ReplaceAll(q);
add a comment |
Your LINQ
statement has to return the parent element (of the one containing the from-attribute) via childEl.Parent
.
From your question is not completely clear whether your container is an XDocument
or an XElement
.
In case of an XElement
the LINQ
statement looks like:
var q =
from childEl in container.Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and the replace as:
container.ReplaceNodes(q);
Note that the LINQ
statement without explicitly specifying the Attr
element names will also do the job:
var q =
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
In case of an XDocument
your query must look like:
var q =
from childEl in container.Element("Attrs").Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and you have to replace the nodes via:
container.Element("Attrs").ReplaceAll(q);
Your LINQ
statement has to return the parent element (of the one containing the from-attribute) via childEl.Parent
.
From your question is not completely clear whether your container is an XDocument
or an XElement
.
In case of an XElement
the LINQ
statement looks like:
var q =
from childEl in container.Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and the replace as:
container.ReplaceNodes(q);
Note that the LINQ
statement without explicitly specifying the Attr
element names will also do the job:
var q =
from childEl in container.Elements().Elements()
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
In case of an XDocument
your query must look like:
var q =
from childEl in container.Element("Attrs").Elements("Attr").Elements("Attr")
where childEl.Attribute("Name")?.Value == "from"
orderby childEl.Attribute("Value")?.Value descending
select childEl.Parent
;
and you have to replace the nodes via:
container.Element("Attrs").ReplaceAll(q);
edited Nov 23 '18 at 8:58
answered Nov 22 '18 at 22:30
pfxpfx
5,240121934
5,240121934
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53426363%2fsorting-of-xcontainer-based-on-attribute-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown