C# XMLSerializer更改元素的名称
我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的XML中的元素包含“:”(p.e.:C# XMLSerializer更改元素的名称,c#,xml,serialization,C#,Xml,Serialization,我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的XML中的元素包含“:”(p.e.:)。 我用[xmldattribute(“ftr:filter”)]和[xmlement(ftr:differentFilter”)]声明了覆盖这些名称的类,但序列化程序生成了不同的节点。我打赌这与编码有关,但我无法更改结果(以为我更改了编码)。 课程示例: public class ListPrijemkaRequest { [XmlAttribute("version")] publ
)。我用
[xmldattribute(“ftr:filter”)]
和[xmlement(ftr:differentFilter”)]
声明了覆盖这些名称的类,但序列化程序生成了不同的节点。我打赌这与编码有关,但我无法更改结果(以为我更改了编码)。课程示例:
public class ListPrijemkaRequest
{
[XmlAttribute("version")]
public string Version { get; set; }
[XmlAttribute("prijemkaVersion")]
public string PrijemkaVersion { get; set; }
[XmlElement("lst:requestPrijemka")]
public List<RequestPrijemka> Requests { get; set; }
}
public class RequestPrijemka
{
[XmlElement("ftr:filter")]
public RequestDateFilter Filter { get; set; }
}
公共类ListPrijemkaRequest
{
[XmlAttribute(“版本”)]
公共字符串版本{get;set;}
[XmlAttribute(“prijemkaVersion”)]
公共字符串PrijemkaVersion{get;set;}
[xmlement(“lst:requestPrijemka”)]
公共列表请求{get;set;}
}
公共类RequestPrijemka
{
[XmlElement(“ftr:filter”)]
公共RequestDateFilter筛选器{get;set;}
}
期望输出:
< lst:listPrijemkaRequest version="2.0" prijemkaVersion="2.0">
< lst:requestPrijemka>
< ftr:filter>
< ftr:dateFrom>2013-01-10</ftr:dateFrom>
< ftr:dateTill>2013-03-30</ftr:dateTill>
< /ftr:filter>
< /lst:requestPrijemka>
< /lst:listPrijemkaRequest>
2013-01-10
2013-03-30
获得的产量:
< lst_x003A_listPrijemkaRequest version="2.0" prijemkaVersion="2.0">
< lst_x003A_requestPrijemka>
< ftr_x003A_filter>
< ftr_x003A_dateFrom>2013-01-10</ftr_x003A_dateFrom>
< ftr_x003A_dateTill>2013-03-30</ftr_x003A_dateTill>
< /ftr_x003A_filter>
< /lst_x003A_requestPrijemka>
< /lst_x003A_listPrijemkaRequest>
2013-01-10
2013-03-30
如果那些“标记”ftr
/lst
是名称空间,则无需对它们进行“硬编码”,您可以将序列化程序设置为使用这些名称空间
示例(摘自)
[XmlRoot(“节点”,命名空间=”http://your.companies.namespace")]
公共类ListPrijemkaRequest{
[XmlElement(“requestPrijemka”)]
公共列表请求{get;set;}
}
静态类程序
{
静态void Main()
{
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
添加(“lst”http://your.companies.namespace");
XmlSerializer xser=新的XmlSerializer(typeof(ListPrijemkaRequest));
Serialize(Console.Out,newlistprijemkarequest(),ns);
}
}
如果不是,我认为“默认”序列化是不可能的
其他选择:
- 使用自定义序列化(
),请参阅:IXmlSerializable
- 对序列化文件进行后期编辑,并用所需的节点名替换字符串
:
![XmlRoot(“listPrijemkaRequest”,Namespace=”http://your.companies.namespace/lst")]
[XmlRoot("listPrijemkaRequest", Namespace = "http://your.companies.namespace/lst")]
public class ListPrijemkaRequest {
[XmlAttribute("version")]
public string Version { get; set; }
[XmlAttribute("prijemkaVersion")]
public string PrijemkaVersion { get; set; }
[XmlElement("requestPrijemka")]
public List<RequestPrijemka> Requests { get; set; }
}
public class RequestDateFilter
{
[XmlElement(ElementName = "dateFrom")]
public DateTime DateFrom { get; set; }
[XmlElement(ElementName = "dateTill")]
public DateTime DateTill { get; set; }
}
public class RequestPrijemka {
[XmlElement("filter", Namespace = "http://your.companies.namespace/ftr")]
public RequestDateFilter Filter { get; set; }
}
static class Program {
static void Main() {
var ns = new XmlSerializerNamespaces();
ns.Add("lst", "http://your.companies.namespace/lst");
ns.Add("ftr", "http://your.companies.namespace/ftr");
var xser = new XmlSerializer(typeof(ListPrijemkaRequest));
var obj = new ListPrijemkaRequest
{
Version = "2.0",
PrijemkaVersion = "2.0",
Requests = new List<RequestPrijemka>
{
new RequestPrijemka
{
Filter = new RequestDateFilter {DateFrom = DateTime.Now, DateTill = DateTime.Now}
}
}
};
xser.Serialize(Console.Out, obj, ns);
Console.ReadLine();
}
}
公共类ListPrijemkaRequest{
[XmlAttribute(“版本”)]
公共字符串版本{get;set;}
[XmlAttribute(“prijemkaVersion”)]
公共字符串PrijemkaVersion{get;set;}
[XmlElement(“requestPrijemka”)]
公共列表请求{get;set;}
}
公共类RequestDateFilter
{
[xmlement(ElementName=“dateFrom”)]
public DateTime DateFrom{get;set;}
[xmlement(ElementName=“dateTill”)]
公共DateTime DateTill{get;set;}
}
公共类RequestPrijemka{
[XmlElement(“过滤器”,命名空间=”http://your.companies.namespace/ftr")]
公共RequestDateFilter筛选器{get;set;}
}
静态类程序{
静态void Main(){
var ns=新的XmlSerializerNamespaces();
添加(“lst”http://your.companies.namespace/lst");
ns.添加(“ftr”http://your.companies.namespace/ftr");
var xser=新的XmlSerializer(typeof(ListPrijemkaRequest));
var obj=新的ListPrijemkaRequest
{
Version=“2.0”,
PrijemkaVersion=“2.0”,
请求=新列表
{
新请求Prijemka
{
Filter=new RequestDateFilter{DateFrom=DateTime.Now,DateTill=DateTime.Now}
}
}
};
序列化(Console.Out、obj、ns);
Console.ReadLine();
}
}
生成以下xml:
<?xml version="1.0" encoding="cp866"?>
<lst:listPrijemkaRequest xmlns:ftr="http://your.companies.namespace/ftr" version="2.0" prijemkaVersion="2.0" xmlns:lst="http://your.companies.namespace/lst">
<lst:requestPrijemka>
<ftr:filter>
<ftr:dateFrom>2014-07-17T16:17:47.0601039+03:00</ftr:dateFrom>
<ftr:dateTill>2014-07-17T16:17:47.061104+03:00</ftr:dateTill>
</ftr:filter>
</lst:requestPrijemka>
</lst:listPrijemkaRequest>
2014-07-17T16:17:47.0601039+03:00
2014-07-17T16:17:47.061104+03:00
看起来与您需要的类似。除非ftr/lst是一个名称空间,否则不建议在节点名称中使用冒号。其他软件是否要求使用冒号?我正在尝试导入的SW供应商提供了多个具有多个名称空间的XSD文件,但我只需要两个(大约15个)我无法从这两个冒号生成类。是否有任何选项可以将冒号“硬编码”为名称?编辑:好的,我将尝试导入未定义名称空间的文档…我根据您(或msdn)的建议编辑了代码,但没有任何用处:
code
[xmlement(Namespace=“ftr”,ElementName=“datetil”)]结果:code
2010-01-01 2014-07-16
<?xml version="1.0" encoding="cp866"?>
<lst:listPrijemkaRequest xmlns:ftr="http://your.companies.namespace/ftr" version="2.0" prijemkaVersion="2.0" xmlns:lst="http://your.companies.namespace/lst">
<lst:requestPrijemka>
<ftr:filter>
<ftr:dateFrom>2014-07-17T16:17:47.0601039+03:00</ftr:dateFrom>
<ftr:dateTill>2014-07-17T16:17:47.061104+03:00</ftr:dateTill>
</ftr:filter>
</lst:requestPrijemka>
</lst:listPrijemkaRequest>