从XML序列化数组中删除包装元素

8
我将使用VSTS2008 + C# + .Net 3.0进行翻译。我使用以下代码来序列化XML,我的对象包含数组类型属性,但生成的XML文件中有一些额外的元素层(在我的示例中为MyInnerObject和MyObject),我希望从生成的XML文件中删除它们。有什么建议吗?
当前生成的XML文件:
<?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>

期望的XML文件,

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

当前代码:

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;
    }
}
1个回答

15

不要使用

[XmlArrayItemAttribute]

使用:

[XmlElement]

为了在将来解决此问题,您可以运行(从VS命令提示符):

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

这将根据 XML 生成可序列化的类,并生成 test.cs 文件。当然,如果您有 .xsd 文件,则效果会更好。


谢谢Sander,你的解决方案有效。你能否再详细描述一下为什么使用XmlArrayItemAttribute会影响结果XML?以及为什么XmlElement可以工作? - George2
2
它们之间只是有一个区别,允许您使用两种 XML 表示形式,XmlElement 跳过属性名称并仅输出元素,XmlArrayItem 创建一个元素数组(以属性名称命名),其中包含您提供的名称。 - Sander Rijken
谢谢Sander,问题已解决。我这里还有一个问题,如果您能帮忙就感激不尽了。https://dev59.com/RkjSa4cB1Zd3GeqPH71E - George2
我已经看了那个问题,我认为那里的答案是正确的,实在没有什么可以改进的。 - Sander Rijken
我知道我已经太晚了,但这个答案帮了我很多!非常感谢你! - Kyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接