Solved

Removal of XML element after LINQ query

Posted on 2009-05-14
3
290 Views
Last Modified: 2013-12-17
My XML doc content:

<?xml version="1.0" encoding="utf-8"?>
<Main>
  <Members type="">
    <Member>
      <Primary notes="">100</Primary>
      <Secondary notes="Phone">5100</Secondary>
    </Member>
    <Member>
      <Primary notes="">200</Primary>
      <Secondary notes="Phone">5200</Secondary>
    </Member>
    <Member>
      <Primary notes="">200</Primary>
      <Secondary notes="Fax">6200</Secondary>
    </Member>
  </Members>
</Main

I am experiencing a problem whereby I cannot remove a Member element in its entirety -- i.e. after running the code below, I always have a blank entry left in the file:    

<Member />

The blank entries are causing me problems later when I attempt additional queries on the data.
m_xmlDoc = XDocument.Load("test.xml");
 
IEnumerable<XElement> membersMap = from memberRef in m_xmlDoc.Descendants("Member")
                                    where memberRef.Element("Primary").Value == "200"
                                    select memberRef;
                    foreach (XElement memberRef in membersMap)
                    {
                        memberRef.RemoveAll(); // remove Primary and Secondary elements
                        //memberRef.Remove(); // this causes an exception!
                    }
m_xmlDoc.Save("test.xml");

Open in new window

0
Comment
Question by:brenlex
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 63

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 24386134
Hi brenlex;

From Microsoft documentation: "In LINQ to XML programming, you should not manipulate or modify a set of nodes while you are querying for nodes in that set. In practical terms, this means that you should not iterate over a set of nodes and remove them. Instead, you should materialize them into a List<(Of <(T>)>) by using the ToList<(Of <(TSource>)>) extension method. Then, you can iterate over the list to remove the nodes.",
http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.remove.aspx

The folloing code snippet will work.

Fernando


m_xmlDoc = XDocument.Load("test.xml");
 
IEnumerable<XElement> membersMap = from memberRef in m_xmlDoc.Descendants("Member")
                                   where memberRef.Element("Primary").Value == "200"
                                   select memberRef;
                                   
foreach (XElement memberRef in membersMap.ToList())
{
    memberRef.Remove(); 
}
m_xmlDoc.Save("test.xml");

Open in new window

0
 

Author Closing Comment

by:brenlex
ID: 31581431
Perfect. Many thanks.
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 24395026
Not a problem, glad to help.  ;=)
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question