2015-02-10 266 views
0

我需要使用串行創建具有某些外觀的xml:XML命名空間

   EPIT11V21 curpit11 = new EPIT11V21(curdec.id); 

       XmlSerializer serializer = new XmlSerializer(typeof(EPIT11V21)); 
       using (TextWriter writer = new StreamWriter(@"F:\xml\Xml.xml")) 
       { 
        serializer.Serialize(writer, curpit11); 
       } 

在我的EPIT11V21類被聲明:

[XmlRoot("Deklaracja")] 
public class EPIT11V21 
{ 
    public EPIT11V21()  {  } 

    public EPIT11V21(int XPDeclarationID) 
    { 
      this.Pouczenie = "Za uchybienie obowiązkom płatnika grozi odpowiedzialność przewidziana w Kodeksie karnym skarbowym."; 
      //this.Zalaczniki = ""; 
     } 

    } 

    public Podmiot1PIT11V21 Podmiot1 = new Podmiot1PIT11V21(); 
    public String Pouczenie { get; set; } 
    public String Zalaczniki{ get; set; } 

與子類:

public class Podmiot1PIT11V21 
{ 
    public Podmiot1PIT11V21(){} 
    [XmlAttribute("rola")] 
    public string rola = "Płatnik"; 
    public OsobaNiefizycznaPIT11V21 OsobaNieFizyczna = new OsobaNiefizycznaPIT11V21(); 
} 


public class OsobaNiefizycznaPIT11V21 
{ 
    public OsobaNiefizycznaPIT11V21(){} 
    public string NIP = "0000000000"; 
    public string PelnaNazwa = "XXXXXXXX"; 
} 

如何裝飾其部件以獲得這樣的效果:

<?xml version="1.0" encoding="UTF-8"?> 
<Deklaracja xsi:schemaLocation="http://crd.gov.pl/wzor/2014/12/08/1887/ http://crd.gov.pl/wzor/2014/12/08/1887/schemat.xsd" xmlns="http://crd.gov.pl/wzor/2014/12/08/1887/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zzu="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/10/07/eD/ORDZU/"> 
    <Podmiot1 rola="Płatnik"> 
     <etd:OsobaNiefizyczna> 
      <etd:NIP>0000000000</etd:NIP> 
      <etd:PelnaNazwa>XXXXXXXXXXXXX</etd:PelnaNazwa> 
     </etd:OsobaNiefizyczna> 
    </Podmiot1> 
    <Zalaczniki> 
    </Zalaczniki> 
</Deklaracja> 

,我會在第二行:

<Deklaracja xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

還怎麼裝飾這clasess所以要得到ETD:前綴作爲例子?

回答

2

你的問題有許多不同的組件:

  1. 爲了使財產OsobaNiefizyczna走在正確的命名空間,與XmlElement裝飾它並正確設置Namespace屬性。

  2. 爲了向根文檔對象添加其他名稱空間,請將[XmlNamespaceDeclarations]屬性附加到返回名稱空間的public XmlSerializerNamespaces xmlsn合成屬性。同時在根對象上正確設置XmlRootAttribute.Namespace

  3. 要使根對象具有schemaLocation屬性,必須在How to add xsi schemalocation to root C# object XmlSerializer的答案的各行中添加合成屬性 - 但使用屬性而不是字段。如果你使用一個字段,你實際上會在內存中添加你的類的佔用空間。

  4. 要省略標準xsd命名空間(儘管我建議您不要),請使用XmlSerializer.Serialize(XmlWriter, Object, XmlSerializerNamespaces)方法並僅傳入要查看的命名空間。

  5. 要顯示一個空的Zalaczniki元素,您需要將屬性值設置爲string.Empty

把這些結合在一起,我們得到:

public static class NameSpaces 
{ 
    static readonly XmlSerializerNamespaces namespaces; 

    static NameSpaces() 
    { 
     namespaces = new XmlSerializerNamespaces(); 
     namespaces.Add("", NameSpaces.Default); 
     namespaces.Add("xsi", NameSpaces.Xsi); 
     namespaces.Add("etd", NameSpaces.Etd); 
     namespaces.Add("zzu", NameSpaces.Zzu); 
    } 

    public static XmlSerializerNamespaces XmlSerializerNamespaces 
    { 
     get 
     { 
      return namespaces; 
     } 
    } 

    public const string Default = "http://crd.gov.pl/wzor/2014/12/08/1887/"; 
    public const string Etd = "http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/"; 
    public const string Xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
    public const string Zzu = "http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/10/07/eD/ORDZU/"; 
    public const string SchemaLocation = "http://crd.gov.pl/wzor/2014/12/08/1887/ http://crd.gov.pl/wzor/2014/12/08/1887/schemat.xsd"; 
} 

[XmlRoot("Deklaracja", Namespace = NameSpaces.Default)] 
public class EPIT11V21 
{ 
    public EPIT11V21() { 
     this.Zalaczniki = string.Empty; 
    } 

    public EPIT11V21(int XPDeclarationID) : this() 
    { 
     this.Pouczenie = "Za uchybienie obowiązkom płatnika grozi odpowiedzialność przewidziana w Kodeksie karnym skarbowym."; 
    } 

    [XmlAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public string XSDSchemaLocation 
    { 
     get 
     { 
      return NameSpaces.SchemaLocation; 
     } 
     set { 
      // Do nothing - fake property. 
     } 
    } 

    public Podmiot1PIT11V21 Podmiot1 = new Podmiot1PIT11V21(); 

    public String Pouczenie { get; set; } 

    public String Zalaczniki { get; set; } 

    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces xmlsn 
    { 
     get 
     { 
      return NameSpaces.XmlSerializerNamespaces; 
     } 
     set { 
      // Do nothing - fake property. 
     } 
    } 
} 

public class Podmiot1PIT11V21 
{ 
    public Podmiot1PIT11V21() { } 

    [XmlAttribute("rola")] 
    public string rola = "Płatnik"; 

    [XmlElement("OsobaNieFizyczna", Namespace = NameSpaces.Etd)] 
    public OsobaNiefizycznaPIT11V21 OsobaNieFizyczna = new OsobaNiefizycznaPIT11V21(); 
} 

public class OsobaNiefizycznaPIT11V21 
{ 
    public OsobaNiefizycznaPIT11V21() { } 
    public string NIP = "0000000000"; 
    public string PelnaNazwa = "XXXXXXXX"; 
} 

而且,爲了測試:

public static class TestClass 
{ 
    public static void Test() 
    { 
     var curpit11 = new EPIT11V21(10101); 

     var xml = XmlSerializationHelper.GetXml(curpit11, NameSpaces.XmlSerializerNamespaces); 
     Debug.WriteLine(xml); 
    } 
} 

public static class XmlSerializationHelper 
{ 
    public static string GetXml<T>(this T obj) 
    { 
     return GetXml(obj, false); 
    } 

    public static string GetXml<T>(this T obj, bool omitNamespace) 
    { 
     return GetXml(obj, new XmlSerializer(obj.GetType()), omitNamespace); 
    } 

    public static string GetXml<T>(this T obj, XmlSerializer serializer) 
    { 
     return GetXml(obj, serializer, false); 
    } 

    public static string GetXml<T>(T obj, XmlSerializer serializer, bool omitStandardNamespaces) 
    { 
     XmlSerializerNamespaces ns = null; 
     if (omitStandardNamespaces) 
     { 
      ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines. 
     } 
     return GetXml(obj, serializer, ns); 
    } 

    public static string GetXml<T>(T obj, XmlSerializerNamespaces ns) 
    { 
     return GetXml(obj, new XmlSerializer(obj.GetType()), ns); 
    } 

    public static string GetXml<T>(T obj, XmlSerializer serializer, XmlSerializerNamespaces ns) 
    { 
     using (var textWriter = new StringWriter()) 
     { 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true;  // For cosmetic purposes. 
      settings.IndentChars = " "; // For cosmetic purposes. 
      using (var xmlWriter = XmlWriter.Create(textWriter, settings)) 
      { 
       if (ns != null) 
        serializer.Serialize(xmlWriter, obj, ns); 
       else 
        serializer.Serialize(xmlWriter, obj); 
      } 
      return textWriter.ToString(); 
     } 
    } 
} 

主要生產

<Deklaracja xmlns:zzu="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/10/07/eD/ORDZU/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/" xsi:schemaLocation="http://crd.gov.pl/wzor/2014/12/08/1887/ http://crd.gov.pl/wzor/2014/12/08/1887/schemat.xsd" xmlns="http://crd.gov.pl/wzor/2014/12/08/1887/"> 
    <Podmiot1 rola="Płatnik"> 
     <etd:OsobaNieFizyczna> 
      <etd:NIP>0000000000</etd:NIP> 
      <etd:PelnaNazwa>XXXXXXXX</etd:PelnaNazwa> 
     </etd:OsobaNieFizyczna> 
    </Podmiot1> 
    <Pouczenie>Za uchybienie obowiązkom płatnika grozi odpowiedzialność przewidziana w Kodeksie karnym skarbowym.</Pouczenie> 
<Zalaczniki /> 
</Deklaracja> 
+0

感謝您的快速響應我會測試它。還有一個問題,我不知道好的xml構建,我如何更改該代碼以使Deklaracja的屬性順序像我在示例中給出的一樣。在你的輸出中,它們的順序不同。 – romeck 2015-02-11 06:08:28

+0

就我所知,你不能用'XmlSerializer'來控制名稱空間屬性的順序。但是,根據[XML規範第3.1節](http://www.w3.org/TR/REC-xml/#sec-starttags),「開始標記或空元素標記中的屬性規範的順序並不重要「。所以這應該不重要。但是,如果您必須按照特定順序(出於政治原因)具有屬性,則可能需要將XML重新加載到「XDocument」中,然後按照以下算法操作:https://stackoverflow.com/questions/28420906/xdocument -save-removing-node-prefixes/28424698#28424698 – dbc 2015-02-11 06:13:14

0

我改變這樣的代碼:

  Declaration curdec = gVDeclarations.GetRow(i) as Declaration; 
      EPIT11V21 curpit11 = new EPIT11V21(curdec.id); 

      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 

      ns.Add("schemaLocation", @"http://crd.gov.pl/wzor/2014/12/08/1887/ http://crd.gov.pl/wzor/2014/12/08/1887/schemat.xsd"); 
      ns.Add("xmlns", @"http://crd.gov.pl/wzor/2014/12/08/1887/"); 
      ns.Add("etd", @"http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/"); 
      ns.Add("xsi", @"http://www.w3.org/2001/XMLSchema-instance"); 
      ns.Add("zzu", @"http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/10/07/eD/ORDZU/"); 

      XmlSerializer serializer = new XmlSerializer(typeof(EPIT11V21)); 
      using (TextWriter writer = new StreamWriter(@"F:\xml\Xml.xml")) 
      { 
       serializer.Serialize(writer, curpit11,ns); 
      } 

,並Deklaracja子clases

public class Podmiot1PIT11V21 
{ 
    public Podmiot1PIT11V21(){} 
    [XmlAttribute("rola")] 
    public string rola = "Płatnik"; 
    [XmlElement("OsobaNieFizyczna", Namespace = "http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/")] 
    public OsobaNiefizycznaPIT11V21 OsobaNieFizyczna = new OsobaNiefizycznaPIT11V21(); 
} 

我得到almoast什麼iwant但第二線,我得到:

<Deklaracja 
xmlns:xmlns="http://crd.gov.pl/wzor/2014/12/08/1887/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:schemaLocation="http://crd.gov.pl/wzor/2014/12/08/1887/ http://crd.gov.pl/wzor/2014/12/08/1887/schemat.xsd" 
xmlns:zzu="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/10/07/eD/ORDZU/" 
xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/"> 

是有辦法只是改變 「NS」,以改變該行簡單的方法?

+0

'schemaLocation'不是一個命名空間。你不能使用'XmlSerializerNamespaces'來添加它。看到這裏:https://stackoverflow.com/questions/27530334/xml-serialization-namespaces – dbc 2015-02-11 06:28:26

+0

另外,它建議問[每個問題一個問題](http://meta.stackexchange.com/questions/39223/one-後與-多的問題 - 或 - 多職位)。如果您對自己的問題提出自問的第二個問題,很少有人會注意到。 – dbc 2015-02-11 06:29:46

+0

建議您避免在代碼中重複使用長字符串常量。 NameSpaces靜態類被設計爲集中它們。 – dbc 2015-02-11 06:31:45