从XML序列化的阵列中删除包装元素 [英] Removing Wrapper Elements from XML-Serialized Array

查看:116
本文介绍了从XML序列化的阵列中删除包装元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用VSTS2008 + C#+ .NET 3.0。我使用低于code序列化XML和我对象包含数组类型的属性,但也有一些其他元素的图层(在我的样本,MyInnerObject和myObject的)产生的,我想从生成的XML文件中删除。任何想法?

目前生成的XML文件,

 < XML版本=1.0&GT?;
< MyClass的的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
  < MyObjectProperty>
    <为MyObject>
      < MyInnerObjectProperty>
        < MyInnerObject>
          <的ObjectName>富类型< /的ObjectName>
        < / MyInnerObject>
      < / MyInnerObjectProperty>
    < /为MyObject>
  < / MyObjectProperty>
< / MyClass的>
 

预计XML文件,

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

目前的code,

 公共类MyClass的
{
    私人为MyObject [] _​​myObjectProperty;

    [XmlArrayItemAttribute(ISNULLABLE = FALSE)]
    公众为MyObject [] MyObjectProperty
    {
        得到
        {
            返回_myObjectProperty;
        }
        组
        {
            _myObjectProperty =价值;
        }
    }
}
公共类为MyObject
{
    私人MyInnerObject [] _​​myInnerObjectProperty;

    [XmlArrayItemAttribute(ISNULLABLE = FALSE)]
    公共MyInnerObject [] MyInnerObjectProperty
    {
        得到
        {
            返回_myInnerObjectProperty;
        }
        组
        {
            _myInnerObjectProperty =价值;
        }
    }
}

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

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

        返回;
    }
}
 

而不是

解决方案

  [XmlArrayItemAttribute]
 

使用:

  [的XmlElement]
 

要弄清楚这一点,在未来,你可以运行(从VS命令提示符):

  XSD.EXE的test.xml
XSD.EXE /类test.xsd
 

这会产生test.cs中,包含XML序列化的类,基于XML。如果你有一个的.xsd各地ofcourse这工作更好

I am using VSTS2008 + C# + .Net 3.0. I am using below code to serialize XML, and my object contains array type property, but there some additional elements' layer (in my sample, MyInnerObject and MyObject) generated which I want to remove from the generated XML file. Any ideas?

Current generated XML file,

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

Expected XML file,

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

Current code,

public class MyClass
{
    private MyObject[] _myObjectProperty;

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

    [XmlArrayItemAttribute(IsNullable = false)]
    public MyInnerObject[] MyInnerObjectProperty
    {
        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].MyInnerObjectProperty = new MyInnerObject[1];
        instance.MyObjectProperty[0].MyInnerObjectProperty[0] = new MyInnerObject();
        instance.MyObjectProperty[0].MyInnerObjectProperty[0].ObjectName = "Foo Type";
        s.Serialize(fs, instance);

        return;
    }
}

解决方案

Instead of

[XmlArrayItemAttribute]

use:

[XmlElement]

To figure this out in the future, you can run (from a VS Command Prompt):

xsd.exe test.xml
xsd.exe /classes test.xsd

This generates test.cs, that contains the xml serializable class, based on the xml. This works even better if you have an .xsd around ofcourse

这篇关于从XML序列化的阵列中删除包装元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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