【问题标题】:Cant deserialize XML with type attribute无法使用类型属性反序列化 XML
【发布时间】:2019-08-20 16:07:59
【问题描述】:

由于“类型”属性,我无法反序列化以下 XML。

到目前为止我已经尝试过:

我要反序列化的 XML:

<foundEntities>
    <staticGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns1:StaticGroupType">
      <number>10000</number>
      <name>Gruppe A</name>
    </staticGroup>
</foundEntities>

班级:

[XmlRootAttribute(Namespace = "", IsNullable = false, ElementName = "foundEntities")]
public class FoundEntities
{
   [XmlElement(ElementName = "staticGroup", Namespace = "")]
   public StaticGroup staticGroup { get; set; }
}

[XmlRoot(ElementName = "staticGroup")]
[XmlInclude(typeof(StaticGroupType))]
public class StaticGroup
{
    [XmlElement(ElementName = "number")]
    public string number { get; set; }
    [XmlElement(ElementName = "name")]
    public string name { get; set; }
}

public class StaticGroupType : StaticGroup
{
}

可能我是盲人,但我在这里想念什么?任何提示都非常感谢。


我使用https://xmltocsharp.azurewebsites.net/ 生成了这些类,它给了我以下输出:

[XmlRoot(ElementName = "staticGroup")]
public class FoundStaticGroup
{
    [XmlElement(ElementName = "number")]
    public string Number { get; set; }
    [XmlElement(ElementName = "name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string Xsi { get; set; }
    [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Type { get; set; }
}

[XmlRoot(ElementName = "foundEntities")]
public class FoundGroupEntities
{
    [XmlElement(ElementName = "staticGroup")]
    public StaticGroup StaticGroup { get; set; }
}

但我现在得到的是一个错误,之前已经有几次了:

“指定的类型未被识别:name='StaticGroupType', namespace='http://com.f24.soap.fwi.schema', at 。”

【问题讨论】:

  • 在此处插入您的 XML 并将其生成的代码与您的代码进行比较:xmltocsharp.azurewebsites.net
  • 感谢您的提示。这是我之前已经尝试过的,我总是遇到与上面编辑过的帖子相同的错误。
  • 将示例数据放入您的类并序列化。然后看xml。问题在于继承的类。当您继承类时,它需要 type 属性才能工作。所以你输入的 xml 文件必须看起来像序列化的输出 xml。
  • 嗨,jdweng。我得到的 XML 是来自服务的响应,所以它对我来说是一个黑匣子。抱歉,我之前可能不得不提到这一点。

标签: c# xml deserialization


【解决方案1】:

我在这里发布了一个可行的解决方案:

DotNetFiddle Link

我不确定是否有外部架构,但我必须删除 xsi:type="ns1:StaticGroupType" 才能让它工作。除非在 XML 或模式中有该名称空间的定义,否则您的 XML 不会在大多数阅读器中解析。不知道你的后端服务是什么,我不能推荐如何解决这个问题。

最大的问题是您的两个类都标有XmlRootAtribute 代码属性。在您的示例中,只有一个类可以代表根。我还删除了不必要的属性,例如 Namespace,因为您使用的是默认命名空间,所以它们没有任何影响。

更新

这里的问题是传入的 XML 不完整,它需要一个模式引用才能解析 StaticGroup 类型。您必须联系后端人员来解决此问题,或手动删除 XML 的那部分。正确的 XML 如下所示:

<foundEntities
    xsi:schemaLocation="http://com.f24.soap.fwi.schema (url to back-end schema here)">
    <staticGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns1:StaticGroupType">
      <number>10000</number>
      <name>Gruppe A</name>
    </staticGroup>
</foundEntities>

【讨论】:

  • 感谢您的提示。问题是,我有一种反序列化响应的通用方法,如果我首先需要“手动”从 xml 中删除部分,它会有点不方便。
  • 查看我的更新,如果您的 XML 示例完整,那么它缺少 StaticGroup 类型的架构位置。直到那时它才会解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多