Question

Hi I want to copy an xml file and insert in a specific element locaiton some more elements; What is the best and easiest way doing this. I can use xmlReader read elements and write one by one referring to each and every type- I had some issues with this but besides this seems to me too mush work that can be done somehow better. in the example below I have the xml as a default definition need to create a new xml in same format with inserting new values to sheet1 - but after existing rows, and do the same for sheet2.

<book>
   <Sheet ss:name="Sheet1">
      <Table >
      <Row >
        <Cell/>
        <Cell>
             Title Name      
        </Cell>
        <Cell >
             Title Description
         </Cell>
      </Row>
   </Sheet>
<a/>
<b/>
  <Sheet ss:name="Sheet2">
      <Table >
      <Row >
        <Cell/>
        <Cell>
             Title Name      
        </Cell>
        <Cell >
             Title Description
         </Cell>
      </Row>
   </Sheet>
</book>
Was it helpful?

Solution

The simplest way in my view would be to load the whole document using LINQ to XML, modify it, then save it out again. That's likely to be easier than using XmlReader, which can get somewhat hairy in my experience.

However, that does involve loading it all into memory - which could be an issue if the documents are huge. Is that likely to be a problem?

EDIT: Here's a short example in LINQ to XML (untested):

XDocument doc = XDocument.Load("test.xml");
XNamespace ss = "http://url/for/ss";
Sheet sheet1 = doc.Descendants("Sheet")
                  .Where(x => (string) x.Attribute(ss + "name") == "Sheet1");
XElement lastRow = sheet1.Elements("Row").LastOrDefault();
// Note: if there aren't any rows, lastRow will be null here. Handle accordingly
lastRow.AddAfterSelf(new XElement("Foo", "Extra value"));

An alternative to the last part, if you just want the new content after all the old content of the sheet:

sheet1.Add(new XElement("Foo", "Extra value"));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top