使用不同版本名称空间序列化/反序列化 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 的方法?的主要内容,如果未能解决你的问题,请参考以下文章

XSD:允许来自不同命名空间的元素在序列中的任何位置

由于命名空间而无法反序列化 xml

序列化和反序列化用XSD.Exe文件使用XML字符串

XmlSchemaValidationException:这是一个无效的 xsi:type 'Book' 尝试反序列化使用 XSD 架构验证它的 XML 时

反序列化然后序列化时保留 Xml Xsd schemaLocation

是否可以基于 XSD 方案反序列化 xml 而不是粘贴特殊的结果?