How to create an XML string instead of using a string builder?

I am using the code below (simplified for this example) to publish 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 string constructor, which is not perfect, so I wonder what should I use instead to create an XML string?

Thanks in advance.

+4
source share
8 answers

You can use Linq for XML, please see 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(); } } } 

It will display:

 <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> 
+15
source
  • Create a class that mimics your XML schema.
  • Create an instance of the class and fill in its properties (attributes, elements)
  • Use XmlSerialization to generate an XML fragment, either as a string or as 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); 
+5
source

If you are writing xml, why not use only XmlWriter formatting? http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx , which is designed to create an xml structure.

+3
source

you can generate xml more dynamically by breaking it like the code below. Here I use the .Add () method to add additional attributes or elements.

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> 
+2
source

If this is an option for you, you can use VB.NET for this part of your project. It allows you to create LINQ to XML objects in a compressed form:

 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> 
+1
source

You can use System.Xml.XmlDocument . Full information can be found on MSDN , but it is easy to handle and is designed specifically for writing XML documents.

0
source

If you have already used the System.Xml api to create an XBatch element, why don't you use it for your entire 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; } 
0
source
  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") 
-1
source

Source: https://habr.com/ru/post/1345670/


All Articles