XMLWriter:带有标记名称和字符串的WriteStartElement,用于指示标记名称

时间:2013-05-08 08:14:37

标签: c# xmlwriter

我对标签名称有不同的标签名称和不同的字符串。

这是XML。

<order>
  <ID>1001</ID> 
  <config>
    <properties>
      <entry key="Total">10</entry> 
      <entry key="Name">name</entry> 
      <entry key="Config">COMMON</entry> 
      <entry key="Delivery">15-FEBRUARY-2013</entry> 
      <entry key="Setting">name</entry> 
    </properties>
    <id>19</id> 
  </config>
  <aID>58239346</aID> 
</order>

这是我目前的代码:

public String cards(string id)
    {
        StringWriter str = new StringWriter();
        XmlTextWriter xmlWriter = new XmlTextWriter(str);
        xmlWriter.Formatting = Formatting.Indented;
        xmlWriter.WriteStartDocument();
        xmlWriter.WriteStartElement("order");
        xmlWriter.WriteElementString("ID", "1001");
        xmlWriter.WriteStartElement("config");
        xmlWriter.WriteStartElement("properties");
        /*
         * Create <entry key> at here 
         * 
         * 
         * 
         *
         */
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndElement();
        xmlWriter.WriteElementString("ClientID", id);
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
        xmlWriter.Flush();
        xmlWriter.Close();
        return str.ToString();
    }

如何为XMLWriter编写条目标记???我不知道如何写它。

4 个答案:

答案 0 :(得分:6)

问题似乎是关于<entry>标签;这基本上是一系列类似于以下的5个区块:

xw.WriteStartElement("entry");
xw.WriteAttributeString("key", "RecordTotal");
xw.WriteString("10");
xw.WriteEndElement();

但是,您可能还想查看XmlSerializer - 可能会使很多更容易:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

static class Program {
    static void Main() {
        var order = new Order {
            ClientId = 1001,
            Id = 58239346,
            Config = new OrderConfig {
                Id = 19,
                Properties = {
                    new OrderProperty { Key = "RecordTotal", Value = "10"},
                    new OrderProperty { Key = "InputFileName", Value = "name"},
                    new OrderProperty { Key = "ConfigName", Value = "COMMON_"},
                    new OrderProperty { Key = "DeliveryDate", Value = "15-FEBRUARY-2013"},
                    new OrderProperty { Key = "Qualifier", Value = "name"}
                }
            }
        };
        var ser = new XmlSerializer(typeof(Order));
        ser.Serialize(Console.Out, order);
    }
}
[XmlRoot("order")]
public class Order {
    [XmlElement("clientID", Order = 0)]
    public int ClientId { get; set; }    
    [XmlElement("config", Order = 1)]
    public OrderConfig Config { get; set; }    
    [XmlElement("orderID", Order = 2)]
    public int Id { get; set; }
}

public class OrderConfig {
    [XmlElement("id", Order = 2)]
    public int Id { get; set; }    
    private readonly List<OrderProperty> properties = new List<OrderProperty>();
    [XmlArray("properties", Order = 1), XmlArrayItem("entry")]
    public List<OrderProperty> Properties { get { return properties; } }
}

public class OrderProperty {
    [XmlAttribute("key")]
    public string Key {get;set;}
    [XmlText]
    public string Value {get;set;}
}

答案 1 :(得分:3)

我很想将Linq-to-XML用于此:

using System;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            XElement root = 
                new XElement("order",
                    new XElement("clientId", 1001),
                    new XElement("config",
                        new XElement("properties",
                            new XElement("entry", new XAttribute("key", "RecordTotal"), 10),
                            new XElement("entry", new XAttribute("key", "InputFileName"), "name"),
                            new XElement("entry", new XAttribute("key", "ConfigName"), "COMMON"),
                            new XElement("entry", new XAttribute("key", "DeliveryDate"), "15-FEBRUARY-2013"),
                            new XElement("entry", new XAttribute("key", "Qualifier"), "name")),
                        new XElement("id", 19)),
                    new XElement("orderID", 58239346)
            );

            Console.WriteLine(root);
        }
    }
}

作为比较,如果你想要多个属性元素,那么XML看起来像这样:

<order>
  <clientId>1001</clientId>
  <config>
    <properties>
      <property>
        <entry key="RecordTotal">10</entry>
        <entry key="InputFileName">name</entry>
        <entry key="ConfigName">COMMON</entry>
        <entry key="DeliveryDate">15-FEBRUARY-2013</entry>
        <entry key="Qualifier">name</entry>
      </property>
      <property>
        <entry key="RecordTotal">15</entry>
        <entry key="InputFileName">othername</entry>
        <entry key="ConfigName">UNCOMMON</entry>
        <entry key="DeliveryDate">23-FEBRUARY-2013</entry>
        <entry key="Qualifier">qname</entry>
      </property>
    </properties>
    <id>19</id>
  </config>
  <orderID>58239346</orderID>
</order>

您的代码可能如下所示:

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            XElement root = 
                new XElement("order",
                    new XElement("clientId", 1001),
                    new XElement("config",
                        new XElement("properties",
                            createEntries(getEntries())),
                        new XElement("id", 19)),
                    new XElement("orderID", 58239346)
            );

            Console.WriteLine(root);
        }

        static IEnumerable<Entry> getEntries()
        {
            yield return new Entry
            {
                RecordTotal   = 10,
                InputFileName = "name",
                ConfigName    = "COMMON",
                DeliveryDate  = "15-FEBRUARY-2013",
                Qualifier     = "name"
            };

            yield return new Entry
            {
                RecordTotal   = 15,
                InputFileName = "othername",
                ConfigName    = "UNCOMMON",
                DeliveryDate  = "23-FEBRUARY-2013",
                Qualifier     = "qname"
            };
        }

        static IEnumerable<XElement> createEntries(IEnumerable<Entry> entries)
        {
            return from entry in entries
                   select new XElement(
                       "property",
                       new XElement("entry", new XAttribute("key", "RecordTotal"),   entry.RecordTotal),
                       new XElement("entry", new XAttribute("key", "InputFileName"), entry.InputFileName),
                       new XElement("entry", new XAttribute("key", "ConfigName"),    entry.ConfigName),
                       new XElement("entry", new XAttribute("key", "DeliveryDate"),  entry.DeliveryDate),
                       new XElement("entry", new XAttribute("key", "Qualifier"),     entry.Qualifier));
        }
    }

    sealed class Entry
    {
        public int RecordTotal;
        public string InputFileName;
        public string ConfigName;
        public string DeliveryDate;
        public string Qualifier;
    }
}

答案 2 :(得分:1)

为每个条目尝试此操作:

xmlWriter.WriteStartElement("entry");
xmlWriter.WriteAttributeString("key", "RecordTotal");
xmlWriter.WriteValue(10);
xmlWriter.WriteEndElement();

答案 3 :(得分:0)

您可以尝试以下新条目:

xmlWriter.WriteStartElement("entry");
xmlWriter.WriteAttributeString("key", "RecordTotal");
xmlWriter.WriteValue(10);
xmlWriter.WriteEndElement();

您可能需要查看XML Serizalizer。以下是与此相关的代码示例:

        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            StringWriter writer = new StringWriter();
            serializer.Serialize(writer, myClass);

            StringBuilder sb = new StringBuilder(writer.ToString());
                                            return sb.ToString();
        }
        catch (Exception ex)
        {
            throw new System.Exception("Class To XML Error: " + ex.Message);
        }