har07
har07

Reputation: 89285

Writing Xml in Windows Phone Application

I have this code that work fine to create an xml document for my WPF application.

var doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);

var parentNode = doc.CreateElement("manga");
doc.AppendChild(parentNode);

foreach (var mList in mangaList)
{
    var itemNode = doc.CreateElement("item");
    var itemAttribute = doc.CreateAttribute("value");
    itemAttribute.Value = mList.Key;
    itemNode.InnerText = mList.Value;
    itemNode.Attributes.Append(itemAttribute);
    parentNode.AppendChild(itemNode);
}

var writer = new XmlTextWriter(@"Data\mangalist.xml", null);
writer.Formatting = Formatting.Indented;
doc.Save(writer);
writer.Close();

Now I want to create similar application for Windows Phone 7.5 and i'm stuck in porting above code to be able to run in WP. After quick searching i found that XmlDocument is not available in Windows Phone and have to switch using XDocument. I am far from familiar with XDocument and hope somebody can help to me make my windows phone apps outputting the same xml. Thanks

Solution :

After good hints from @Pradeep Kesharwani and @dav_i I managed to port those codes above to use XDocument and StreamWriter instead of XmlDocument and XmlTextWriter which are not available for WP:

var doc = new XDocument(new XDeclaration("1.0", "utf-8", "no"));
var root = new XElement("manga");

var mangaList = new Dictionary<string, string>();
mangaList.Add("conan", "conan");
mangaList.Add("naruto", "naruto");
foreach (var mList in mangaList)
{
    var itemNode = new XElement("item");
    var itemAttribute = new XAttribute("value", mList.Key);
    itemNode.Value = mList.Value;
    itemNode.Add(itemAttribute);
    root.Add(itemNode);
}
doc.Add(root);

using (var writer = new StreamWriter(@"Data\mangalist2.xml"))
{
    writer.Write(doc.ToString());
}

Upvotes: 2

Views: 447

Answers (2)

Pradeep Kesharwani
Pradeep Kesharwani

Reputation: 1478

This Create method could be used to create a xml doc in wp7

private void CreateXml()
{
    string xmlStr = "<RootNode></RootNode>";
    XDocument document = XDocument.Parse(xmlStr);
    XElement ex = new XElement(new XElement("FirstNOde"));
    XElement ex1 = new XElement(new XElement("second"));
    ex1.Value = "fdfgf";
    ex.Add(ex1);
    document.Root.Add(new XElement("ChildNode", "World!"));
    document.Root.Add(new XElement("ChildNode", "World!"));
    document.Root.Add(ex);
    string newXmlStr = document.ToString();           
}

This will be the created xml

<RootNode>
  <ChildNode>World!</ChildNode>
  <ChildNode>World!</ChildNode>
  <FirstNOde>
    <second>fdfgf</second>
  </FirstNOde>
</RootNode>

public void ReadXml()
{
    IsolatedStorageFileStream isoFileStream = myIsolatedStorage.OpenFile("Your xml file name", FileMode.Open);

    using (XmlReader reader = XmlReader.Create(isoFileStream))
    {
        XDocument xml = XDocument.Load(reader);
        XElement root1 = xml.Root;
    }
}

Upvotes: 1

dav_i
dav_i

Reputation: 28107

As I said in comments, XDocument is pretty straight forward -

new XDocument(
    new XDeclaration("1.0", "utf-8", "no"),
    new XElement("root",
        new XElement("something",
            new XAttribute("attribute", "asdf"),
            new XElement("value", 1234),
            new XElement("value2", 4567)
        ),
        new XElement("something",
            new XAttribute("attribute", "asdf"),
            new XElement("value", 1234),
            new XElement("value2", 4567)
        )
    )
)

Gives the following

<root>
  <something attribute="asdf">
    <value>1234</value>
    <value2>4567</value2>
  </something>
  <something attribute="asdf">
    <value>1234</value>
    <value2>4567</value2>
  </something>
</root>

Hopefully this will help you!


To automatically populate in a loop, you could do something like this:

var somethings = new List<XElement>();

for (int i = 0; i < 3; i++)
    somethings.Add(new XElement("something", new XAttribute("attribute", i + 1)));

var document = new XDocument(
    new XElement("root",
        somethings));

Which results in

<root>
  <something attribute="1" />
  <something attribute="2" />
  <something attribute="3" />
</root>

Upvotes: 3

Related Questions