-->

XMLWriter的:WriteStartElement有标签名称和字符串来表示标签名(XMLWri

2019-09-02 05:08发布

我有相同的标记名称和不同的字符串不同的标记名称。

这里是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的入境标签??? 我不知道怎么写。

Answer 1:

这个问题似乎是关于<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;}
}


Answer 2:

我会尝试使用LINQ到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;
    }
}


Answer 3:

试试这个为每个条目:

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


Answer 4:

你可以尝试下面的一个新条目:

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


文章来源: XMLWriter: WriteStartElement with a tag name and string to indicate tag name
标签: c# xmlwriter