Click here to Skip to main content
15,909,656 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
See more:
Hello All

I have a problem. I'm trying to figure out how to query an XML file and then create a new XML with the results. This is what I have.

The original file looks similar to this:

XML
<?xml version="1.0"?>
<TopNode>
    <event uid="{AS1}">
        <vertex Lat="13.33" Lon="46.33"/>
        <vertex Lat="14.44" Lon="46.44"/>
        <vertex Lat="15.55" Lon="46.55"/>
        <vertex Lat="16.66" Lon="46.66"/>
    <event uid="{AS2}">
        <vertex Lat="23.33" Lon="56.33"/>
        <vertex Lat="24.44" Lon="56.44"/>
        <vertex Lat="25.55" Lon="56.55"/>
        <vertex Lat="26.66" Lon="56.66"/>
    <event uid="{AS3}">
        <vertex Lat="33.33" Lon="66.33"/>
        <vertex Lat="34.44" Lon="66.44"/>
        <vertex Lat="35.55" Lon="66.55"/>
        <vertex Lat="36.66" Lon="66.66"/>
    <event uid="{AS4}">
        <vertex Lat="43.33" Lon="76.33"/>
        <vertex Lat="44.44" Lon="76.44"/>
        <vertex Lat="45.55" Lon="76.55"/>
        <vertex Lat="46.66" Lon="76.66"/>
</TopNode>


I'm trying to set up a query from C# CheckedListBox that would have the list of AS1, AS2, AS3, AS4. I want if I have AS2 and AS4 checked that everything associated with what is checked gets pushed to a new XML document that would look like this and then saved with a new name.

XML
<?xml version="1.0"?>
<TopNode>
    <event uid="{AS2}">
        <vertex Lat="23.33" Lon="56.33"/>
        <vertex Lat="24.44" Lon="56.44"/>
        <vertex Lat="25.55" Lon="56.55"/>
        <vertex Lat="26.66" Lon="56.66"/>
    <event uid="{AS4}">
        <vertex Lat="43.33" Lon="76.33"/>
        <vertex Lat="44.44" Lon="76.44"/>
        <vertex Lat="45.55" Lon="76.55"/>
        <vertex Lat="46.66" Lon="76.66"/>
</TopNode>


I know this is all possible but my mind is blank on the idea. Any help would be much appreciated.

Thanks
Posted

I think the required result can be obtained using the Where extension method of IEnumerable of XElement, as shown below:
C#
string xmlData = @"<?xml version=""1.0""?>
                    <TopNode>
                        <event uid=""{AS1}"">
                            <vertex Lat=""13.33"" Lon=""46.33""/>
                            <vertex Lat=""14.44"" Lon=""46.44""/>
                            <vertex Lat=""15.55"" Lon=""46.55""/>
                            <vertex Lat=""16.66"" Lon=""46.66""/>
                        </event>
                        <event uid=""{AS2}"">
                            <vertex Lat=""23.33"" Lon=""56.33""/>
                            <vertex Lat=""24.44"" Lon=""56.44""/>
                            <vertex Lat=""25.55"" Lon=""56.55""/>
                            <vertex Lat=""26.66"" Lon=""56.66""/>
                        </event>
                        <event uid=""{AS3}"">
                            <vertex Lat=""33.33"" Lon=""66.33""/>
                            <vertex Lat=""34.44"" Lon=""66.44""/>
                            <vertex Lat=""35.55"" Lon=""66.55""/>
                        <vertex Lat=""36.66"" Lon=""66.66""/>
                        </event>
                        <event uid=""{AS4}"">
                            <vertex Lat=""43.33"" Lon=""76.33""/>
                            <vertex Lat=""44.44"" Lon=""76.44""/>
                            <vertex Lat=""45.55"" Lon=""76.55""/>
                            <vertex Lat=""46.66"" Lon=""76.66""/>
                        </event>
                    </TopNode>";
XDocument xdoc = XDocument.Parse(xmlData);
var requiredAttValues = new string[] {"{AS2}","{AS4}"};
var requiredElements = xdoc.Root.Elements().Where (r =>
    requiredAttValues.Contains(r.Attribute("uid").Value));

var partDoc =new XDocument (
    new XDeclaration ("1.0", "utf-8", "no"));
var root = new XElement("TopNode");
root.Add(requiredElements);
partDoc.Add(root);
partDoc.Save(outFileName);

//Contents of the output file
//<?xml version="1.0" encoding="utf-8" standalone="no"?>
//<TopNode>
//  <event uid="{AS2}">
//  <vertex Lat="23.33" Lon="56.33" />
//  <vertex Lat="24.44" Lon="56.44" />
//  <vertex Lat="25.55" Lon="56.55" />
//  <vertex Lat="26.66" Lon="56.66" />
//  </event>
//  <event uid="{AS4}">
//  <vertex Lat="43.33" Lon="76.33" />
//  <vertex Lat="44.44" Lon="76.44" />
//  <vertex Lat="45.55" Lon="76.55" />
//  <vertex Lat="46.66" Lon="76.66" />
//  </event>
//</TopNode>
 
Share this answer
 
Comments
Pandvi 4-Jun-12 1:59am    
Good work! +5!
VJ Reddy 4-Jun-12 3:23am    
Thank you, Pandvi :)
here is very simple solution that i am giving you. first readxml data and put into a datatable than using dataview filter the data as you want. and put this dataview data into a datatable than this datatale simply creat xml file. here is simple example

C#
private void ReadxmlFromXml(string file_Path)
    {
        DataSet DS= new DataSet();     
        FileInfo FInfo = new FileInfo(file_Path);
        if (FInfo.Exists)
        {
            System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(FInfo.FullName);
            xmlReader.WhitespaceHandling = WhitespaceHandling.None;
            try
            {
                DS.ReadXml(xmlReader);

DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = "your condtition";
DataTable dtEx = dv.ToTable();

DataSet DS1= new DataSet(); 
DS1.Merge(dtEx);

string newxml=DS1.GetXml();
//--- now write code for save this xmlstring to file


            }
            catch (Exception ex)
            {
            }
            finally
            {
            }

        }
    }
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900