Solved

Removal of XML element after LINQ query

Posted on 2009-05-14
3
284 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
  • 2
3 Comments
 
LVL 62

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 62

Expert Comment

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

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Using MS Code on my Mac 6 47
Open a folder with partial name 14 29
Convert string to date 3 40
DataGridview Currency Formating? 22 38
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

760 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

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now