【问题标题】:Placing a Property into a Different XML Namespace with XML Serialization使用 XML 序列化将属性放入不同的 XML 命名空间
【发布时间】:2009-08-04 15:19:06
【问题描述】:

我正在使用 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;
    }
}

【问题讨论】:

  • George,您什么时候停止使用 .NET 3.5 SP1?
  • 约翰,我正在做几个项目。其中一些是从零开始开发的,我将使用 .Net 3.5 SP1 + .Net 2.0 SP2。对于遗留项目,我将保留其原始 .Net 版本。遗憾的是 LINQ 不能在基于 .Net 3.0 的项目中使用。无论如何,对我的问题有什么想法吗?
  • 我正在努力。我敢肯定,有人会在我面前给出答案。

标签: c# .net xml visual-studio-2008 xml-serialization


【解决方案1】:

这个怎么样:

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

【讨论】:

    【解决方案2】:

    试试

    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>
    

    【讨论】:

      【解决方案3】:

      您需要创建一个 XmlSerializerNamespaces 对象,并将所需的命名空间添加到其中。

      XmlSerializerNamespaces 对象包含 XmlSerializer 用于在 XML 文档实例中生成限定名称的 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

      【讨论】:

      • 谢谢罗伯特。我的目的不是将 MyClass 类的所有内容添加到统一的命名空间中,而是将 MyInnerObjectProperties 元素添加到命名空间“foo/2009”中。我认为您的解决方案会将 MyClass 类中的所有元素添加到“foo/2009”中,对吗?对我的问题有什么想法吗?
      • 你不必为整个班级使用它。您可以挑选所需的元素和属性。见msdn.microsoft.com/en-us/library/…
      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2012-06-17
      • 2013-05-02
      相关资源
      最近更新 更多