Nick
Nick

Reputation: 1579

How to create XML string instead of using string builder?

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.

Upvotes: 7

Views: 55337

Answers (8)

user4704833
user4704833

Reputation: 14

    Dim sb As New StringBuilder()
    Dim sb1 As New StringBuilder()
    Dim a As String
    Dim ds As New DataSet()
    sb1.Append("<HEAD ")
    sb1.AppendFormat("invoiceno={0}{1}{0}", Chr(34), invoiceno)
    sb1.AppendFormat(" customercode={0}{1}{0}", Chr(34), Cuscode)
    sb1.AppendFormat(" invDate={0}{1}{0}", Chr(34), invdate)
    sb1.Append(" />")
    a = sb1.ToString()
    sb.Append("<SAVE>")
    For Each dr In dt.Rows
        sb.AppendFormat("<INVOIEC No ={0}{1}{0}", Chr(34), dr("No"), Chr(34))
        sb.AppendFormat(" ItemCode ={0}{1}{0}", Chr(34), dr("ItemCode"), Chr(34))
        sb.AppendFormat(" Qty ={0}{1}{0}", Chr(34), dr("Qty"), Chr(34))
        sb.AppendFormat(" Rate = {0}{1}{0}", Chr(34), dr("Rate"), Chr(34))
        sb.AppendFormat(" Amount = {0}{1}{0}", Chr(34), dr("Amount"), Chr(34))
        sb.AppendFormat(" />")
    Next
    sb.Append("</SAVE>")
    a = sb.ToString()
    Return INVDL.save(sb1, sb, "usp_SaveInvoice")

Upvotes: -1

Maate
Maate

Reputation: 1000

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>

Upvotes: 3

Serge Wautier
Serge Wautier

Reputation: 21898

  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);

Upvotes: 10

Heinzi
Heinzi

Reputation: 172408

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>

Upvotes: 1

bruno conde
bruno conde

Reputation: 48265

If you already used the api of System.Xml to create the XBatch element why don't you use it for all your xml fragment?

    private XmlElement CreateXmlDoc(string name, int age, string city, string country)
    {
        XmlDocument xDoc = new XmlDocument();
        XmlElement xBatch = xDoc.CreateElement("Batch");
        xBatch.SetAttribute("OnError", "Continue");
        xDoc.AppendChild(xBatch);

        XmlElement method = xDoc.CreateElement("Method");
        method.SetAttribute("ID", "1");
        method.SetAttribute("Cmd", "New");
        xBatch.AppendChild(method);

        method.AppendChild(createFieldElement(xDoc, "Name", name));
        method.AppendChild(createFieldElement(xDoc, "Age", name));
        method.AppendChild(createFieldElement(xDoc, "City", name));
        method.AppendChild(createFieldElement(xDoc, "Country", name));

        return xBatch;
    }

    private XmlElement createFieldElement(XmlDocument doc, string name, string value) 
    {
        XmlElement field = doc.CreateElement("Field");
        field.SetAttribute("Name", name);
        field.Value = value;
        return field;
    }

Upvotes: 0

Maate
Maate

Reputation: 1000

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>

Upvotes: 21

AndyM
AndyM

Reputation: 1200

You should be able to use System.Xml.XmlDocument. Full details can be found on MSDN but it's pretty easy to get to grips with and is designed specifically for writing XML docs.

Upvotes: 0

Scott Reed
Scott Reed

Reputation: 501

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.

Upvotes: 3

Related Questions