【问题标题】:Use XML attributes to specify a unique XML name and/or namespace for the type使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间
【发布时间】: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")]。不需要。

标签: c# xml


【解决方案1】:

XmlAttribute 有这个,如:

[XmlAttribute (Namespace = "http://www.cpandl.com")]

见:https://learn.microsoft.com/en-us/dotnet/api/system.xml.serialization.xmlattributeattribute?view=net-7.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多