【问题标题】:Xml serialization with custom schema and IXmlSerializable具有自定义架构和 IXmlSerializable 的 Xml 序列化
【发布时间】:2015-07-14 14:09:34
【问题描述】:

我正在尝试使用IXmlSerializableXmlSchemaProviderAttribute 序列化一个对象。

架构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="BuildingsSchema" targetNamespace="BuildingModelSchema"
    elementFormDefault="qualified"
    xmlns="BuildingModelSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:element name="buildings">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="building" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                        ...

获取架构的代码如下所示(如 here 所示):

[<Literal>]
let XML_NAMESPACE                       = "BuildingModelSchema"
[<Literal>]
let XSD_SCHEMA_PATH                     = @"BuildingsSchema.xsd"

[<XmlSchemaProvider(BuildingsSchema)>]
type BuildingsStatistics() =
    interface IXmlSerializable with
    ...
    static member BuildingsSchema(xs: XmlSchemaSet) =
        let serializer = new XmlSerializer(typeof<XmlSchema>)
        let schema = (serializer.Deserialize(new XmlTextReader(XSD_SCHEMA_PATH), null)) :?> XmlSchema
        xs.XmlResolver <- new XmlUrlResolver()
        xs.Add(schema) |> ignore

        new XmlQualifiedName("buildings", XML_NAMESPACE)
    ...

现在,当我尝试使用 XmlSerializer 序列化对象时,出现异常: {"PlanerModel.BuildingsStatistics.BuildingsSchema() 必须返回有效的类型名称。在 targetNamespace='BuildingModelSchema' 中找不到类型“buildings”。”}

编辑:
在尝试反序列化有效的测试文档后,我收到了相同的错误消息。我预计 xml 架构有问题,但由于这是我第一次使用 xml 架构,我似乎没有发现错误。

进一步测试表明在XmlSerializer初始化时抛出异常:

XmlSerializer ser = new XmlSerializer(typeof(BuildingsStatistics)); // Exception is thrown here
ser.Deserialize(...)                                                // Will not be executed

此外,BuildingsSchema 方法中添加的XmlSchema 不包含任何元素(在我的情况下,0 个元素和 14 个全为“空”的项目(没有行号、位置等))。

【问题讨论】:

    标签: c# xml serialization f# ixmlserializable


    【解决方案1】:

    我找到了解决问题的方法:我必须将架构定义更改为

    <xs:complexType name="buildingsType">
        <xs:sequence>
            <xs:element name="building" type="buildingType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    ...
    

    以及在BuildingsSchema 中返回的XmlQualifiedName

    new XmlQualifiedName("buildingType", XML_NAMESPACE) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多