C# C XML序列化-更改数组项名称
我需要将具有List属性的对象序列化为XML,以获得如下XML代码我知道这不是有效的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
<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();
}
}