.net C # Spliting xml file

I am using code from Code Project to split an xml file into multiple files. It works fine in this case below: "Registration" is the parent node, and when split is among the "Registration"

<Registrations> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> 

But the code does not work when the XML file is in this format: "RegistrationOpenData" is the root node, then there is another node "Registration", and the separation must be performed among the "Registration"

 <RegistrationOpenData xmlns:i="............" xmlns=""> <Description>......</Description> <InformationURL>..........</InformationURL> <SourceAgency>...............</SourceAgency> <SourceSystem>...........</SourceSystem> <StartDate>................</StartDate> <EndDate i:nil="true" /> <Registrations> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> <Registration xmlns:i="..............."> <RegistrationID>108260</RegistrationID> ................... .................. </Registration> </Registrations> </RegistrationOpenData> 

The code I'm using is below:

 private void buttonSPLIT_Click(object sender, EventArgs e) { string sourceFile = @"D:\sample.xml"; string rootElement = "RegistrationOpenData"; string descElement = "Registration"; int take = 1; string destFilePrefix = "RegistrationsPart"; string destPath = @"D:\PART\"; SplitXmlFile(sourceFile, rootElement, descElement, take, destFilePrefix, destPath); } private static void SplitXmlFile(string sourceFile , string rootElement , string descendantElement , int takeElements , string destFilePrefix , string destPath) { XElement xml = XElement.Load(sourceFile); // Child elements from source file to split by. var childNodes = xml.Descendants(descendantElement); // This is the total number of elements to be sliced up into // separate files. int cnt = childNodes.Count(); var skip = 0; var take = takeElements; var fileno = 0; // Split elements into chunks and save to disk. while (skip < cnt) { // Extract portion of the xml elements. var c1 = childNodes.Skip(skip) .Take(take); // Setup number of elements to skip on next iteration. skip += take; // File sequence no for split file. fileno += 1; // Filename for split file. var filename = String.Format(destFilePrefix + "_{0}.xml", fileno); // Create a partial xml document. XElement frag = new XElement(rootElement, c1); // Save to disk. frag.Save(destPath + filename); } } 
+5
source share
2 answers

I just checked your code in VS 2015 and it seems to work. It generates 3 XML files with the following contents:

 <?xml version="1.0" encoding="utf-8"?> <RegistrationOpenData> <Registration> <RegistrationID>108260</RegistrationID> </Registration> </RegistrationOpenData> 

Is that what you expect? Can you give more details about your problem?

+1
source

as a quick fix (I assume you don't want to make changes to your script code project), you can add this line:

 private static void SplitXmlFile(string sourceFile , string rootElement , string descendantElement , int takeElements , string destFilePrefix , string destPath) { XElement xml = XElement.Load(sourceFile); XNamespace ns = "http://services.hpd.gov"; // This line must be added. xml = xml.Element(ns + rootElement); // rootElement must be "Registrations". And also this line must be added. // Child elements from source file to split by. var childNodes = xml.Descendants(ns + descendantElement); ..... ..... 

sample works here: https://dotnetfiddle.net/6sOOdH

0
source

All Articles