gpt4 book ai didi

c# - XmlAttribute 不适用于 XmlArray

转载 作者:行者123 更新时间:2023-11-30 22:25:08 25 4
gpt4 key购买 nike

我在使用 XmlSerializer 生成以下 XML 结构时遇到问题:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>This is root.</Name>
<OtherValue>Otha.</OtherValue>
<Shapes Name="This attribute is ignored!">
<Circle>
<Name>This</Name>
<Value>Is</Value>
<Whatever>Circle</Whatever>
</Circle>
<Square>
<Name>And</Name>
<Value>this is</Value>
<Something>Square</Something>
</Square>
</Shapes>
</Root>

唯一的问题是 <Shapes> 的属性 没有被写入。我用于序列化的类如下:

public class Root
{
[XmlElement]
public string Name { get; set; }

[XmlElement]
public string OtherValue { get; set; }

[XmlArray("Shapes")]
[XmlArrayItem("Circle", typeof(Circle))]
[XmlArrayItem("Square", typeof(Square))]
public ShapeList Shapes { get; set; }
}

public class ShapeList : List<Shape>
{
// Attribute that is not in output
[XmlAttribute]
public string Name { get; set; }
}

public class Shape
{
public string Name { get; set; }
public string Value { get; set; }
}

public class Circle : Shape
{
public string Whatever { get; set; }
}

public class Square : Shape
{
public string Something { get; set; }
}

还有一些运行序列化的主要方法:

public static void Main(String[] args)
{
var extraTypes = new Type[] {
typeof(Shape),
typeof(Square),
typeof(Circle)
};

var root = new Root();
root.Name = "This is root.";
root.OtherValue = "Otha.";

root.Shapes = new ShapeList()
{
new Circle() { Name = "This", Value="Is", Whatever="Circle" },
new Square() { Name = "And", Value="this is", Something="Square" }
};
root.Shapes.Name = "This is shapes.";

using (var sw = new StreamWriter("data.xml"))
{
var serializer = new XmlSerializer(typeof(Root), extraTypes);
serializer.Serialize(sw, root);
}
}
  • 为什么我得不到 ShapeListName 属性?
  • 如果用这种方法无法做到,是否还有其他简单的方法?

最佳答案

数组外部不处理属性;为此只处理叶节点 - 集合只是:它们的内容。有一种方法可以做到这一点,如果您不介意让模型更复杂一点......

public class Root
{
[XmlElement]
public string Name { get; set; }

[XmlElement]
public string OtherValue { get; set; }

[XmlElement("Shapes")]
public ShapeContainer Shapes { get; set; }
}

public class ShapeContainer
{
[XmlAttribute]
public string Name { get; set; }

private readonly List<Shape> items = new List<Shape>();
[XmlElement("Circle", typeof(Circle))]
[XmlElement("Square", typeof(Square))]
public List<Shape> Items { get { return items; } }
}

public class Shape
{
public string Name { get; set; }
public string Value { get; set; }
}

public class Circle : Shape
{
public string Whatever { get; set; }
}

public class Square : Shape
{
public string Something { get; set; }
}

用法更改如下:

root.Shapes = new ShapeContainer();
root.Shapes.Items.Add(new Circle() { Name = "This", Value="Is", Whatever="Circle" });
root.Shapes.Items.Add(new Square() { Name = "And", Value = "this is", Something = "Square" });
root.Shapes.Name = "This is shapes.";

关于c# - XmlAttribute 不适用于 XmlArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com