0

I am trying to create xml file like below

        <IMEI>ABCD</IMEI>
        <Manufacturer>Nokia</Manufacturer>
        <Model>Lumia 525</Model>
        <Items>
           <Item>
                <Name>Contact</Name>
                <Size>
                    <Value>123</Value>
                    <Type>KB</Type>
                </Size>
                <MD5>78sd8f6sd6fsdf8sdbs5f78svbfsd576s</ MD5>
                <Desc>Contact is added</ Desc >
           </Item>
        </Items>

I have tried something like this

doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"));

doc.Add(new XElement(("IMEI"), "ABCD"));
doc.Add(new XElement("Manufacturer"), "Nokia");
doc.Add(new XElement("Model"), "Lumia 525");
var contactsElement = new XElement("Item",
                        new XElement("Name", "Contact"),
                        new XElement("Size",
                            new XElement("Value", "123"),
                            new XElement("Type", "KB")),
                       new XElement("MD5", "78sd8f6sd6fsdf8sdbs5f78svbfsd576s"),
                       new XElement("Desc", "Contact File"));
var mainNode = new XElement("Items", new XElement(contactsElement));
doc.Root.Add(mainNode);

But not getting correct file. I also want to append new Item in Items node. How can I append when I get new item?

MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
Ajay
  • 6,418
  • 18
  • 79
  • 130

1 Answers1

0
  1. Your XML is invalid as posted. It should have single root element to be a valid XML.
  2. The way your code adds new element is wrong. It will add two nodes instead of one : one empty xml element node, and a text node.

You can try this way to generate correctly formatted XML :

doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
                                        new XElement("Root"));
doc.Root.Add(new XElement("IMEI", "ABCD"));
doc.Root.Add(new XElement("Manufacturer", "Nokia"));
doc.Root.Add(new XElement("Model", "Lumia 525"));
var contactsElement = new XElement("Item",
                                    new XElement("Name", "Contact"),
                                    new XElement("Size",
                                        new XElement("Value", "123"),
                                        new XElement("Type", "KB")),
                                    new XElement("MD5", "78sd8f6sd6fsdf8sdbs5f78svbfsd576s"),
                                    new XElement("Desc", "Contact File"));
var mainNode = new XElement("Items", new XElement(contactsElement));
doc.Root.Add(mainNode);

And for adding new Item within Items element later :

//get existing <Items> element
var items = doc.Root.Element("Items");
//add new <Item> to <Items>
items.Add(XElement.Parse(newContactsElement));
//then save the XDocument back replacing previously saved XML
har07
  • 88,338
  • 12
  • 84
  • 137
  • Thank you for reply. Is it not possible to add data with out `Root` node? – Ajay Apr 16 '14 at 12:03
  • Not possible. As mentioned above, that will results an invalid XML markup. Invalid XML can't be loaded to most XML abstraction classes (such as `XDocument`, `XmlDocument`, `XElement`, etc.). You'll end up treating the "XML" as plain string, which is painful. – har07 Apr 16 '14 at 12:25