我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的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/

10-09 06:26