如何创建XML字符串而不是使用字符串生成器?

时间:2011-03-29 07:44:04

标签: c# asp.net xml sharepoint

我使用下面的代码(本例简化)将数据发布到SharePoint列表

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

正如您所看到的,我正在使用一个不理想的字符串构建器,所以我想知道应该使用什么来代替创建XML字符串?

提前致谢。

8 个答案:

答案 0 :(得分:16)

您可以将Linq用于XML,请查看以下内容:http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

例如,此代码:

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

将输出:

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

答案 1 :(得分:8)

  1. 创建一个模仿XML架构的类。
  2. 实例化类并填充其属性(属性,元素)
  3. 使用XmlSerialization以字符串或流的形式生成XML片段。
  4. 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);
    

答案 2 :(得分:3)

如果你写xml为什么不使用前进只有XmlWriter? http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx它专为创建xml结构而设计。

答案 3 :(得分:2)

你可以像下面的代码那样分解它,从而更加动态地生成xml。在这里,我使用.Add()方法附加更多属性或alements。

溴。的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();
        }
    }
}

此代码输出:

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

答案 4 :(得分:1)

如果这是您的选择,您可能希望在项目的这一部分使用VB.NET。它允许以非常简洁的方式创建 LINQ to XML 对象:

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>

答案 5 :(得分:0)

您应该可以使用System.Xml.XmlDocument。完整的details can be found on MSDN,但它很容易掌握,专门用于编写XML文档。

答案 6 :(得分:0)

如果您已使用System.Xml的api创建XBatch元素,为什么不将它用于所有xml片段?

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

答案 7 :(得分:-1)

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