【发布时间】:2022-12-08 20:48:05
【问题描述】:
我正在尝试将以下对象序列化为 xml:
[XmlRoot("Root")]
public class RootElement
{
[XmlElement("Manafacture")]
public ManafactureElement Manafacture { get; set; }
}
[XmlType("Manafacture")]
public class ManafactureElement
{
[XmlAttribute]
public string Name { get; set; }
[XmlElement("Transport")]
public TransportElement[] Transports { get; set; }
}
[XmlType("Transport")]
[XmlInclude(typeof(CarElement)), XmlInclude(typeof(BikeElement))]
public class TransportElement
{
[XmlElement(nameof(Brand))]
public string Brand { get; set; }
[XmlElement(nameof(Wheels))]
public int Wheels { get; set; }
}
public class CarElement : TransportElement
{
[XmlElement("Cross")]
public CrossCar IsCross { get; set; }
}
public class BikeElement : TransportElement
{
[XmlElement("Cross")]
public Cross IsCross { get; set; }
}
[XmlType("Cross")]
public class CrossCar
{
public string IsCross { get; set; }
}
[XmlType("Cross")]
public class Cross
{
public string IsCross { get; set; }
}
但是在序列化时,我收到以下错误 - “InvalidOperationException:类型‘ConsoleApp1.Cross’和‘ConsoleApp1.CrossCar’都使用命名空间‘’中的 XML 类型名称‘Cross’。使用 XML 属性指定唯一的 XML 名称和/或类型的命名空间。”。 我知道我有两个元素(CarElement,BikeElement)具有相同的类型但没有命名空间。但这就是我想要实现的,所以我的元素没有填充的命名空间。
<?xml version="1.0" encoding="utf-16"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Manafacture Name="Manafacture">
<Transport xsi:type="CarElement">
<Brand>Tank</Brand>
<Wheels>2</Wheels>
<Cross>
<IsCross>Yes</IsCross>
</Cross>
</Transport>
<Transport xsi:type="CarElement">
<Brand>BMW</Brand>
<Wheels>4</Wheels>
<Cross>
<IsCross>No</IsCross>
</Cross>
</Transport>
</Manafacture>
</Root>
但是对于 xml,上面指定了名称空间“xsi:type="CarElement"",我不需要它,因为在这种情况下我没有通过 xsd 方案。期待 XML:
<?xml version="1.0" encoding="utf-16"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Manafacture Name="Manafacture">
<Transport>
<Brand>Tank</Brand>
<Wheels>2</Wheels>
<Cross>
<IsCross>Yes</IsCross>
</Cross>
</Transport>
<Transport>
<Brand>BMW</Brand>
<Wheels>4</Wheels>
<Cross>
<IsCross>No</IsCross>
</Cross>
</Transport>
</Manafacture>
</Root>
【问题讨论】:
-
交叉的不同类别有什么意义?它具有相同的属性......此外......从“Expecting xml”你甚至不知道哪个是BikeElement和哪个CarElement ......所以这个类也没有意义
-
尝试删除 [XmlType("Transport")]。不需要。