Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C XML序列化-更改数组项名称_C#_.net_Xml_Xml Serialization - Fatal编程技术网

C# C XML序列化-更改数组项名称

C# C XML序列化-更改数组项名称,c#,.net,xml,xml-serialization,C#,.net,Xml,Xml Serialization,我需要将具有List属性的对象序列化为XML,以获得如下XML代码我知道这不是有效的XML,但我的第三方应用程序需要以下格式: <Filters> <Criteria_0 Parameter="STATUS" Operator="EQUAL" Value="STARTED" /> <Criteria_1 Parameter="STATUS" Operator="EQUAL" Value

我需要将具有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);
    }
}
它工作得几乎完美。序列化程序返回包含不必要的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,我需要做哪些更改?

我认为,这个代码块将解决您的问题,您需要序列化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();
    }

}

我不能对答案发表评论,但我看不出上面的内容是如何编译的,而且似乎名称空间是意外设置的,我相信您已经解决了,但对于子孙后代,我认为需要进行一些更改才能使其按预期工作:

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

}