C # XML сериализация - изменить имя элемента массива

1

Мне нужно сериализовать объекты со свойством List в XML, чтобы получить такой XML-код (я знаю, что это недействительный XML, но моему стороннему приложению нужен этот формат):

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

Он работает почти идеально. Сериализатор возвращает XML-код с ненужным элементом JobFilterCriteria.

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

Что мне нужно изменить, чтобы удалить JobFilterCriteria из XML-кода?

Теги:
xml-serialization

2 ответа

0
Лучший ответ

Я думаю, этот блок кода решит вашу проблему, вам нужно сериализовать класс 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();
    }

}
  • 0
    Спасибо. Работает правильно.
0

Я не могу комментировать ответы, но я не вижу, как это происходит, и кажется, что пространство имен установлено случайно, я уверен, что вы его разработали, но для потомков несколько изменений, которые я считаю необходимы для того, чтобы они работали по назначению:

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

}
  • 0
    Да, ты прав. Это работает после нескольких изменений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню