Reputation: 199
I am using a code from Code Project to split an xml file into multiple files. It is working fine in this below case: "Registrations" is the parent node and when split is among "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 is not working when XML file is in this format: "RegistrationOpenData" is the root node, then there is another node "Registrations" and split has to be made among "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 that I am using is as 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);
}
}
Upvotes: 5
Views: 250
Reputation: 642
as a quick solution (i assume you do not want to make changes in your codeproject script) 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);
.....
.....
here is working sample: https://dotnetfiddle.net/6sOOdH
Upvotes: 0
Reputation: 3970
I have just tested your code in VS 2015 and it seems to work. It generates 3 XML files with the following content:
<?xml version="1.0" encoding="utf-8"?>
<RegistrationOpenData>
<Registration>
<RegistrationID>108260</RegistrationID>
</Registration>
</RegistrationOpenData>
Is it what you are expecting ? Can you give more details on your issue ?
Upvotes: 1