放置属性与XML序列化一个不同的XML命名空间 [英] Placing a Property into a Different XML Namespace with XML Serialization

查看:130
本文介绍了放置属性与XML序列化一个不同的XML命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用VSTS2008 + C#+ .NET 3.0。我使用下面的代码序列化XML,这里是我当前的代码,系列化的XML文件。我的目的是想使MyInnerObjectProperties属于一个特殊的XML命名空间(的http://富/ 2009 ),使这个命名空间作为默认命名空间。任何想法如何实现这一



电流输出:

 < ;?XML版本=1.0>?; 
< MyClass的XMLNS:XSI =http://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =http://www.w3.org/2001/XMLSchema>
< MyObjectProperty>
< MyInnerObjectProperties>
< MyInnerObjectProperty>
<&的ObjectName GT;富类型< /&的ObjectName GT;
< / MyInnerObjectProperty>
< MyInnerObjectProperty>
<&的ObjectName GT;粘粘类型< /&的ObjectName GT;
< / MyInnerObjectProperty>
< / MyInnerObjectProperties>
< / MyObjectProperty>
< / MyClass的>

当前代码:

 公共类MyClass的
{
私人MyObject的[] _myObjectProperty;

[的XmlElement(ISNULLABLE = FALSE)]
公众为MyObject [] MyObjectProperty
{
得到
{
返回_myObjectProperty;
}

{
_myObjectProperty =价值;
}
}
}
公共类MyObject的
{
私人MyInnerObject [] _myInnerObjectProperty;

[XmlArrayItemAttribute(MyInnerObjectProperty的typeof(MyInnerObject),ISNULLABLE = FALSE)]
公共MyInnerObject [] MyInnerObjectProperties
{
得到
{
返回_myInnerObjectProperty;
}

{
_myInnerObjectProperty =价值;
}
}
}

公共类MyInnerObject
{
公共字符串的ObjectName;
}

公共类节目
{
静态无效的主要(字串[] args)
{
XmlSerializer的S =新的XmlSerializer(typeof运算(我的课));
的FileStream FS =新的FileStream(foo.xml,FileMode.Create);
MyClass的实例=新MyClass的();
instance.MyObjectProperty =新MyObject的[1];
instance.MyObjectProperty [0] =新MyObject来();
instance.MyObjectProperty [0] .MyInnerObjectProperties =新MyInnerObject [2];
instance.MyObjectProperty [0] .MyInnerObjectProperties [0] =新MyInnerObject();
instance.MyObjectProperty [0] .MyInnerObjectProperties [0] .ObjectName =富类型;
instance.MyObjectProperty [0] .MyInnerObjectProperties [1] =新MyInnerObject();
instance.MyObjectProperty [0] .MyInnerObjectProperties [1] .ObjectName =咕类型;

s.Serialize(FS,实例);

的回报;
}
}


解决方案

您需要创建一个 XmlSerializerNamespaces 对象,并添加您需要的命名空间给它。



XmlSerializerNamespaces 对象包含XML命名空间和前缀的XmlSerializer的用来生成一个XML文档实例限定名称。



在C#代码:

  XmlSerializerNamespaces myNameSpaces =新XmlSerializerNamespaces( ); 
myNameSpaces.Add(MyInnerObject,HTTP://富/ 2009);



然后,将属性添加到您的类,像这样的:


$ [(://富/ 2009 HTTP命名空间=)的XmlElement]

 公共类MyInnerObject 
{
C $ C>

在更多信息:



http://msdn.microsoft.com/en-us/library/system.xml.serialization。 xmlserializernamespaces.aspx


I am using VSTS2008 + C# + .Net 3.0. I am using below code to serialize XML, here is my current code and serialized XML file. My purpose is I want to make MyInnerObjectProperties belongs to a special XML namespace (http://foo/2009) and making this namespace as default namespace. Any ideas how to implement this?

Current output:

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyObjectProperty>
    <MyInnerObjectProperties>
      <MyInnerObjectProperty>
        <ObjectName>Foo Type</ObjectName>
      </MyInnerObjectProperty>
      <MyInnerObjectProperty>
        <ObjectName>Goo Type</ObjectName>
      </MyInnerObjectProperty>
    </MyInnerObjectProperties>
  </MyObjectProperty>
</MyClass>

Current code:

public class MyClass
{
    private MyObject[] _myObjectProperty;

    [XmlElement(IsNullable=false)]
    public MyObject[] MyObjectProperty
    {
        get
        {
            return _myObjectProperty;
        }
        set
        {
            _myObjectProperty = value;
        }
    }
}
public class MyObject
{
    private MyInnerObject[] _myInnerObjectProperty;

    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof(MyInnerObject),  IsNullable=false)]
    public MyInnerObject[] MyInnerObjectProperties
    {
        get
        {
            return _myInnerObjectProperty;
        }
        set
        {
            _myInnerObjectProperty = value;
        }
    }
}

public class MyInnerObject
{
    public string ObjectName;
}

public class Program
{
    static void Main(string[] args)
    {
        XmlSerializer s = new XmlSerializer(typeof(MyClass));
        FileStream fs = new FileStream("foo.xml", FileMode.Create);
        MyClass instance = new MyClass();
        instance.MyObjectProperty = new MyObject[1];
        instance.MyObjectProperty[0] = new MyObject();
        instance.MyObjectProperty[0].MyInnerObjectProperties = new MyInnerObject[2];
        instance.MyObjectProperty[0].MyInnerObjectProperties[0] = new MyInnerObject();
        instance.MyObjectProperty[0].MyInnerObjectProperties[0].ObjectName = "Foo Type";
        instance.MyObjectProperty[0].MyInnerObjectProperties[1] = new MyInnerObject();
        instance.MyObjectProperty[0].MyInnerObjectProperties[1].ObjectName = "Goo Type";

        s.Serialize(fs, instance);

        return;
    }
}

解决方案

You need to create an XmlSerializerNamespaces object, and add your needed namespaces to it.

The XmlSerializerNamespaces object contains the XML namespaces and prefixes that the XmlSerializer uses to generate qualified names in an XML-document instance.

In your c# code:

XmlSerializerNamespaces myNameSpaces = new XmlSerializerNamespaces();
myNameSpaces.Add("MyInnerObject", "http://foo/2009");

Then, add an attribute to your class, like this:

public class MyInnerObject
{
[XmlElement(Namespace = "http://foo/2009")]

More info at:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx

这篇关于放置属性与XML序列化一个不同的XML命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆