【问题标题】:C# XML serialization - Change array item nameC# XML 序列化 - 更改数组项名称
【发布时间】:2023-03-20 08:30:01
【问题描述】:

我需要将具有 List 属性的对象序列化为 XML 以获得这样的 XML 代码(我知道它不是有效的 XML,但我的第 3 方应用程序需要这种格式):

<Filters>
    <Criteria_0 Parameter="STATUS"
        Operator="EQUAL"
        Value="STARTED" />
    <Criteria_1 Parameter="STATUS" 
        Operator="EQUAL"
        Value="COMPLETED" />
</Filters>

我写了这样的代码:

public class JobStatusListTask
{
    public JobListSettings ListSettings;

    public List<JobFilterCriteria> Filters;

    public JobStatusListTask()
    {
        Filters = new List<JobFilterCriteria>();
        Filters.Add(new JobFilterCriteria("STATUS", CriteriaOperator.Equal, "ERROR"));
    }


    public JobStatusListTask(JobListSettings settings) : this()
    {
        ListSettings = settings;
    }
}

public class JobFilterCriteria : IXmlSerializable
{
    public static int Count = 0;

    public string Parameter;

    public CriteriaOperator Operator;

    public string Value;

    private JobFilterCriteria()
    {
        Parameter = string.Empty;
        Value = string.Empty;
    }

    public JobFilterCriteria(string parameter, CriteriaOperator criteriaOperator, string value)
    {
        Parameter = parameter;
        Operator = criteriaOperator;
        Value = value;
    }

    XmlSchema IXmlSerializable.GetSchema()
    {
        return null;
    }

    void IXmlSerializable.ReadXml(XmlReader reader)
    {
        throw new NotImplementedException();
    }

    void IXmlSerializable.WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement(string.Format("Criteria_{0}", Count++));
        writer.WriteAttributeString("Parameter", Parameter);
        writer.WriteAttributeString("Operator", Operator.ToString());
        writer.WriteAttributeString("Value", Value);
    }
}

它工作得几乎完美。序列化程序返回带有不必要 JobFilterCriteria 元素的 XML 代码。

<?xml version="1.0" encoding="utf-8"?>
<Filters>
    <JobFilterCriteria>
        <Criteria_0 
            Parameter="STATUS" Operator="Equal" Value="ERROR" />
    </JobFilterCriteria>
    <JobFilterCriteria>
        <Criteria_1 
            Parameter="STATUS" Operator="Equal" Value="STARTED" />
    </JobFilterCriteria>
</Filters>

从 XML 代码中删除 JobFilterCriteria 需要进行哪些更改?

【问题讨论】:

    标签: c# .net xml xml-serialization


    【解决方案1】:

    我想,这个代码块会解决你的问题,你需要序列化 ​​JobStatusListTask 类。

    public class JobStatusListTask : IXmlSerializable
    {
        public JobListSettings ListSettings;
    
        public List<JobFilterCriteria> Filters;
    
        public JobStatusListTask()
        {
            Filters = new List<JobFilterCriteria>();
            Filters.Add(new JobFilterCriteria("STATUS", CriteriaOperator.Equal, "ERROR"));
        }
    
    
        public JobStatusListTask(JobListSettings settings) : this()
        {
            ListSettings = settings;
        }
    
        public void WriteXml(XmlWriter writer)
        {
            writer.WriteStartElement("Filters");
            foreach(var item in Filters)
            {
                writer.WriteStartElement("Criteria", string.Format("Criteria_{0}", Count++));
                writer.WriteAttributeString("Parameter", Parameter);
                writer.WriteAttributeString("Operator", Operator.ToString());
                writer.WriteAttributeString("Value", Value);
            }
            writer.WriteEndElement();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      我无法对答案发表评论,但我看不到上面的编译方式是如何按原样编译的,而且似乎命名空间是被意外设置的,我相信你已经解决了,但为了后代,有一些变化我认为需要使其按预期工作:

      public class JobStatusListTask : IXmlSerializable
      {
          public JobListSettings ListSettings;
      
          public List<JobFilterCriteria> Filters;
      
          public JobStatusListTask()
          {
              Filters = new List<JobFilterCriteria>();
              Filters.Add(new JobFilterCriteria("STATUS", CriteriaOperator.Equal, "ERROR"));
          }
      
      
          public JobStatusListTask(JobListSettings settings) : this()
          {
              ListSettings = settings;
          }
      
          public void WriteXml(XmlWriter writer)
          {
              writer.WriteStartElement("Filters");
              for(int i = 0; i < Filters.Count; i++)
              {
                  writer.WriteStartElement(string.Format("Criteria_{0}", i));
                  writer.WriteAttributeString("Parameter", Parameter);
                  writer.WriteAttributeString("Operator", Operator.ToString());
                  writer.WriteAttributeString("Value", Value);
              }
              writer.WriteEndElement();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多