Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XMLSerializer更改元素的名称_C#_Xml_Serialization - Fatal编程技术网

C# XMLSerializer更改元素的名称

C# XMLSerializer更改元素的名称,c#,xml,serialization,C#,Xml,Serialization,我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的XML中的元素包含“:”(p.e.:)。 我用[xmldattribute(“ftr:filter”)]和[xmlement(ftr:differentFilter”)]声明了覆盖这些名称的类,但序列化程序生成了不同的节点。我打赌这与编码有关,但我无法更改结果(以为我更改了编码)。 课程示例: public class ListPrijemkaRequest { [XmlAttribute("version")] publ

我正在尝试序列化要导入到另一个软件的对象,问题是,要导入的XML中的元素包含“:”(p.e.:
)。
我用
[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>