使用不同版本名称空间序列化/反序列化 XSD 的方法?
Posted
技术标签:
【中文标题】使用不同版本名称空间序列化/反序列化 XSD 的方法?【英文标题】:Way to Serializing / Deserializing XSD with different version namespaces? 【发布时间】:2021-01-18 14:45:02 【问题描述】:有什么方法可以允许序列化/反序列化为具有首选命名空间的 XML 并在失败时使用替代方法?
更具体地说,我定义了一个 XSD,其分段如下...
<xs:schema targetNamespace="http://www.PrimaryNameSpaceV2.com"
xmlns="http://www.PrimaryNameSpaceV2.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
它为我生成了包含以下内容的类定义...
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute("MyObject", Namespace="http://www.PrimaryNameSpaceV2", AnonymousType=true)]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("MyObject", Namespace="http://www.PrimaryNameSpaceV2")]
现在我在序列化包含以下内容的标头中的数据时没有问题
<xmlns="http://www.PrimaryNameSpaceV2.com">
这并不奇怪。但是,当命名空间是先前版本时,我会收到意外内容的错误。这对我来说也不足为奇,因为显然命名空间是不同的。 V2 与 V1。
<xmlns="http://www.PrimaryNameSpaceV1.com">
我希望能够使用 PrimaryNameSpaceV2 进行序列化和反序列化,如果 PrimaryNameSpaceV2 失败,请尝试使用 PrimaryNameSpaceV1。但是我不确定除了创建一个全新的 xsd 以及一组全新的类定义之外,是否还有其他方法可以做到这一点。是否没有简明的方法来支持这些命名空间的两个版本? 如果有一些支持此操作的基本版本控制信息,我们深表歉意,但我无法为此类操作找到任何资源。
【问题讨论】:
你可以使用xml linq。您可以使用 XDocument doc = XDocument.Load(filename); 获取默认命名空间XElement root = doc.Root; XNameSpace ns = root.GetDefaultNameSpace(); 【参考方案1】:我建议在进行任何其他处理之前将输入 XML 转换为一致的形式,通常是通过在处理管道中添加 XSLT 步骤。同样,通过输出管道上的最后一个后处理步骤来处理输出格式的变化。
【讨论】:
以上是关于使用不同版本名称空间序列化/反序列化 XSD 的方法?的主要内容,如果未能解决你的问题,请参考以下文章
XmlSchemaValidationException:这是一个无效的 xsi:type 'Book' 尝试反序列化使用 XSD 架构验证它的 XML 时