How to create XML string instead of using string builder?

50,232

Solution 1

You could use Linq to XML, please check out something like: http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx.

For example, this code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
using System.Xml.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            String name = "Morten";
            Int32 age = 30;
            String city = "Copenhagen";
            String country = "Denmark";

            XElement xml = new XElement("Method", 
                new XAttribute("ID", 1), 
                new XAttribute("Cmd", "New"),
                new XElement("Field", 
                    new XAttribute("Name", "Name"), 
                    name),
                new XElement("Field", 
                    new XAttribute("Name", "Age"), 
                    age),
                new XElement("Field", 
                    new XAttribute("Name", "City"), 
                    city),
                new XElement("Field", 
                    new XAttribute("Name", "Country"), 
                    country)
            );

            Console.WriteLine(xml);
            Console.ReadKey();
        }
    }
}

Will output:

<Method ID="1" Cmd="New">
  <Field Name="Name">Morten</Field>
  <Field Name="Age">30</Field>
  <Field Name="City">Copenhagen</Field>
  <Field Name="Country">Denmark</Field>
</Method>

Solution 2

  1. Create a class that mimics your XML schema.
  2. Instantiate the class and fill its properties (attributes, elements)
  3. Use XmlSerialization to generate an XML fragment either as a string or a stream.

d

public class Method
{
  [XmlAttribute()]
  public int ID {get;set;}

  [XmlAttribute()]
  public string Cmd {get;set;}

  public string Name {get;set;}
  public int Age {get;set;}
  public string City {get;set;}
  public string Country {get;set;}
}

public class Batch
{
  public Method Method { get; set; }
}

public static string ToXml(object Doc)
{
  try
  {
    // Save to XML string
    XmlSerializer ser = new XmlSerializer(Doc.GetType());
    var sb = new StringBuilder();
    using (var writer = XmlWriter.Create(sb))
    {
      ser.Serialize(writer, Doc);
    }
    return sb.ToString();
  }
  catch (Exception ex)
  { // Weird!
    ProcessException();
  }
}

var batch = new Batch();
batch.Method = new Method { ID=..., Cmd=..., ...};

var xml = ToXml(batch);

Solution 3

If your writing xml why not use the forward only XmlWriter? http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx it's designed for creating the xml structure.

Solution 4

you can generate xml more dynamically by breaking it up like the code below. Here, I use the .Add() method to append more attributes or alements.

Br. Morten

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
using System.Xml.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            String name = "Morten";
            Int32 age = 30;
            String city = "Copenhagen";
            String country = "Denmark";

            String customerId = "100";

            XElement xml = new XElement("Method");
            if (!String.IsNullOrEmpty(customerId))
            {
                xml.Add(new XAttribute("ID", 1), new XAttribute("Cmd", "Update"));
            }
            else
            {
                xml.Add(new XAttribute("ID", customerId),new XAttribute("Cmd", "New"));
            }

            xml.Add(
                new XElement("Field", 
                    new XAttribute("Name", "Name"), 
                    name),
                new XElement("Field", 
                    new XAttribute("Name", "Age"), 
                    age),
                new XElement("Field", 
                    new XAttribute("Name", "City"), 
                    city),
                new XElement("Field", 
                    new XAttribute("Name", "Country"), 
                    country)
            );

            Console.WriteLine(xml);
            Console.ReadKey();
        }
    }
}

This code outputs:

<Method ID="1" Cmd="Update">
  <Field Name="Name">Morten</Field>
  <Field Name="Age">30</Field>
  <Field Name="City">Copenhagen</Field>
  <Field Name="Country">Denmark</Field>
</Method>

Solution 5

If that's an option for you, you might want to use VB.NET for this part of your project. It allows LINQ to XML objects to be created in a very concise way:

Dim xml As XElement = <Method ID="1" Cmd="New">
                          <Field Name="Name"><%= Name %></Field>
                          <Field Name="Age"><%= age %></Field>
                          <Field Name="City"><%= city %></Field>
                          <Field Name="Country"><%= country %></Field>
                      </Method>
Share:
50,232
Nick
Author by

Nick

Updated on March 24, 2020

Comments

  • Nick
    Nick about 4 years

    I am using the code below (simplified for this example) to post data to a SharePoint list

    StringBuilder customerDoc = new StringBuilder();
    
    customerDoc.Append("<Method ID='1' Cmd='New'>");
    customerDoc.Append("<Field Name='Name'>" + Name + "</Field>");
    customerDoc.Append("<Field Name='Age'>" + age + "</Field>");
    customerDoc.Append("<Field Name='City'>" + city + "</Field>");
    customerDoc.Append("<Field Name='Country'>" + country + "</Field>");
    
    customerDoc.Append("</Method>");
    
    XmlDocument xDoc = new XmlDocument();
    XmlElement xBatch = xDoc.CreateElement("Batch");
    xBatch.SetAttribute("OnError", "Continue");
    
    xBatch.InnerXml = sb_method.ToString();
    
    XmlNode xn_return = sharePoint.listsObj.UpdateListItems(ConfigurationManager.AppSettings["SaveCustomer"].ToString(), xBatch);
    

    As you can see I am using a stringbuilder which isn't ideal so I wonder what I should use instead to create an XML string?

    Thanks in advance.

  • Nick
    Nick about 13 years
    Hi, maybe I simplified my example too much, I actually have a condtion for checking if the customer already exist or not. How could I alter your code to cater for "if (!String.IsNullOrEmpty(customerId)) { sb_method.Append("<Method ID='1' Cmd='Update'>"); sb_method.Append("<Field Name='ID'>" + customerId + "</Field>"); } else { sb_method.Append("<Method ID='1' Cmd='New'>"); }"
  • Maate
    Maate about 13 years
    Hi, I don't know how to put my whole answer with code into this comment - so I've posted it in the bottom of this question as a new answer instead.
  • rayryeng
    rayryeng about 9 years
    Usually code dumping answers are discouraged. It would be nice to include a brief description of what's going on in the above code, and why you decided to make those design choices in creating the code. Remember, you're not only answering the question to help the question poser, but you're also posting for future users who may encounter the same problem. Being verbose in your answer goes a long way.