我正在尝试序列化对象以导入到另一个软件,问题是,要导入的 XML 中的元素包含“:”(例如:< 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/