2014-07-17 142 views
1

我試圖序列化對象以導入到另一個軟件,問題是,要導入的XML中的元素包含「:」(p.e .: < ftr:filter>)。
我聲明瞭類覆蓋這些名稱與[XmlAttribute("ftr:filter")][XMLElement(ftr:differentFilter")],但串行器產品不同的節點。我敢打賭,它與編碼有關,但我無法改變結果(以爲我改變了編碼)。類
實施例:XMLSerializer更改元素的名稱

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; } 
} 

期望ooutput:

< 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> 
+1

除非ftr/lst是名稱空間,否則不建議在節點名稱中使用冒號。 其他軟件是否需要它們? – derape

+0

我試圖導入SW的供應商提供了多個帶有多個命名空間的XSD文件,但我只需要兩個(類似於15),我無法從這兩個生成類。我有什麼辦法可以將這些冒號「硬編碼」成名字嗎? 編輯:好點,我會嘗試導入名稱空間未定義的文檔... – Klemikaze

+0

不,不工作。 – Klemikaze

回答

3

如果這些 「標籤」 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); 
    } 
} 

如果沒有,我不認爲這是可能的 「默認」 的序列化。

其他選項:

但就像我在我的評論中所說的那樣,建議不要在節點名稱中首先使用:

+0

我編輯的代碼根據您的(或msdn)建議,但沒有用: 結果: 'code' 2010-01-01 2014年7月16日 Klemikaze

+0

我會probabbly嘗試的後期編輯,它會更快實現... – Klemikaze

1
[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(); 
    } 
} 

生成此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> 

看起來與你所需要的相似。