Помещение свойства в другое пространство имен XML с помощью сериализации XML - PullRequest
3 голосов
/ 04 августа 2009

Я использую VSTS2008 + C # + .Net 3.0. Я использую код ниже для сериализации XML, вот мой текущий код и сериализованный файл XML. Я хочу, чтобы MyInnerObjectProperties принадлежал специальному пространству имен XML (http://foo/2009)) и сделал это пространство имен пространством имен по умолчанию. Есть идеи, как это реализовать?

Токовый выход:

<?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>

Текущий код:

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

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Как насчет этого:

[XmlArrayItemAttribute( Namespace = "http://foo.com/2009" /* other attr. params. */ )]
public MyInnerObject[] MyInnerObjectProperties
{
    get { ... }
    set { ... }
}
2 голосов
/ 04 августа 2009

Попробуйте

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

для меня это производит:

<?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>
1 голос
/ 04 августа 2009

Вам необходимо создать объект XmlSerializerNamespaces и добавить к нему необходимые пространства имен.

Объект XmlSerializerNamespaces содержит пространства имен XML и префиксы, которые XmlSerializer использует для генерации квалифицированных имен в экземпляре XML-документа.

В вашем коде c #:

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

Затем добавьте атрибут к вашему классу, например так:

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

Более подробная информация по адресу:

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

...