简体   繁体   English

使用XML序列化将属性放入不同的XML命名空间

[英]Placing a Property into a Different XML Namespace with XML Serialization

I am using VSTS2008 + C# + .Net 3.0. 我使用的是VSTS2008 + C#+ .Net 3.0。 I am using below code to serialize XML, here is my current code and serialized XML file. 我使用下面的代码来序列化XML,这是我当前的代码和序列化的XML文件。 My purpose is I want to make MyInnerObjectProperties belongs to a special XML namespace ( http://foo/2009 ) and making this namespace as default namespace. 我的目的是让MyInnerObjectProperties属于一个特殊的XML命名空间( http:// foo / 2009 )并将此命名空间作为默认命名空间。 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;
    }
}

How about this: 这个怎么样:

[XmlArrayItemAttribute( Namespace = "http://foo.com/2009" /* other attr. params. */ )]
public MyInnerObject[] MyInnerObjectProperties
{
    get { ... }
    set { ... }
}

Try 尝试

public class MyObject
{
    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof (MyInnerObject),
        IsNullable = false)]
    [XmlArray(Namespace = "http://foo.com/2009")]
    public MyInnerObject[] MyInnerObjectProperties { get; set; }
}

for me, this produces: 对我来说,这会产生:

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

You need to create an XmlSerializerNamespaces object, and add your needed namespaces to it. 您需要创建一个XmlSerializerNamespaces对象,并将所需的命名空间添加到它。

The XmlSerializerNamespaces object contains the XML namespaces and prefixes that the XmlSerializer uses to generate qualified names in an XML-document instance. XmlSerializerNamespaces对象包含XmlSerializer用于在XML文档实例中生成限定名称的XML名称空间和前缀。

In your c# code: 在你的c#代码中:

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 http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM