簡體   English   中英

C#中子類的XML名稱空間

[英]XML namespaces for sub class in c#

我需要使用序列化程序創建具有某些外觀的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">

還有如何裝飾該類以便獲得etd:前綴,如示例???

您的問題包含許多不同的組成部分:

  1. 為了使屬性OsobaNiefizyczna進入正確的名稱空間,請使用XmlElement裝飾它並正確設置Namespace屬性。

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

  3. 若要使根對象具有schemaLocation屬性,必須按照如何將xsi schemalocation添加到根c#對象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>

我這樣更改代碼:

            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子句

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

我得到了我想要的但我得到的第二行:

    <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”來更改該行?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM