我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的XML中的元素包含“:”(p.e.:< ftr:filter>
)。
我声明了用[XmlAttribute("ftr:filter")]
和[XMLElement(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; }
}
期望输出:
< 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>
获得的输出:
< 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>
最佳答案
如果这些“标记”ftr
/lst
是命名空间,则无需“硬编码”它们,您可以设置序列化程序以使用这些命名空间。
http://msdn.microsoft.com/en-us/library/ms163161%28v=vs.110%29.aspx
示例(取自XML Serialization and namespace prefixes)
[XmlRoot("Node", Namespace="http://your.companies.namespace")]
public class ListPrijemkaRequest {
[XmlElement("requestPrijemka")]
public List<RequestPrijemka> Requests { get; set; }
}
static class Program
{
static void Main()
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("lst", "http://your.companies.namespace");
XmlSerializer xser = new XmlSerializer(typeof(ListPrijemkaRequest));
xser.Serialize(Console.Out, new ListPrijemkaRequest(), ns);
}
}
如果不是,我认为用“默认”序列化是不可能的。
其他选项:
使用自定义序列化(
IXmlSerializable
),请参见:http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly对序列化文件进行后期编辑,并用所需的节点名替换字符串
但正如我在评论中所说,首先不建议在节点名中使用
:
!关于c# - XMLSerializer更改元素名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24803001/