繁体   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