【问题标题】:The specified type was not recognized error deserializing XML指定类型未被识别错误反序列化 XML
【发布时间】:2014-10-10 06:50:50
【问题描述】:

我正在尝试使用 C# 反序列化以下 XML:

<stix:STIX_Package xmlns:stixVocabs="http://stix.mitre.org/default_vocabularies-1" 
    xmlns:stixCommon="http://stix.mitre.org/common-1" 
    xmlns:stix="http://stix.mitre.org/stix-1" 
    xmlns:indicator="http://stix.mitre.org/Indicator-2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    id="repository:03163c66-23ed-4e7f-8814-be1d08406" version="1.0">
    <stix:Indicators>
        <stix:Indicator id="repository:9df9af32-3b29-4482-81ac-9c090a44db8c"
            xsi:type="indicator:IndicatorType" negate="false" version="2.0">
            <indicator:Title>admin on 24th September 2014 - (1) FileObjects</indicator:Title>
            <indicator:Type xsi:type="stixVocabs:IndicatorTypeVocab-   1.0">Exfiltration</indicator:Type>
            <indicator:Description>Some Ex filtration Happened</indicator:Description>
        </stix:Indicator>
        <stix:Indicator id="repository:9df9af32-3b29-4482-81ac-9c090a44db8d" xsi:type="indicator:IndicatorType" negate="false" version="2.0">
            <indicator:Title>admin on 24th September 2014 - (2) FileObjects</indicator:Title>
            <indicator:Type xsi:type="stixVocabs:IndicatorTypeVocab-1.0">Exfiltration</indicator:Type>
            <indicator:Description>Some Ex filtration Happened Again</indicator:Description>
        </stix:Indicator>
    </stix:Indicators>
</stix:STIX_Package>

我的班级结构:

[XmlType(AnonymousType = true, Namespace = "http://stix.mitre.org/stix-1")]
[XmlRoot(Namespace = "http://stix.mitre.org/stix-1", IsNullable = false)]
public class STIX_Package
{
    [XmlArrayItemAttribute("Indicator", IsNullable = false)]
    public IndicatorType[] Indicators { get; set; }

    [XmlAttribute]
    public string id { get; set; }

    [XmlAttribute]
    public decimal version { get; set; }
}

[XmlRoot(ElementName = "Indicator")]
[XmlType("Indicator", Namespace = "http://stix.mitre.org/stix-1")]
public class IndicatorType : IndicatorBaseType
{
    [XmlElement("Title", Namespace = "http://stix.mitre.org/Indicator-2")]
    public string Title { get; set; }

    [XmlElement("Type", Namespace = "http://stix.mitre.org/Indicator-2")]
    public List<ControlledVocabularyStringType> Type { get; set; }

    [XmlElement("Description", Namespace = "http://stix.mitre.org/Indicator-2")]
    public StructuredTextType Description { get; set; }

    [XmlAttribute, System.ComponentModel.DefaultValueAttribute(false)]
    public bool negate { get; set; }
}

[XmlRoot(ElementName = "Indicator")]
[XmlInclude(typeof(IndicatorType))]
public class IndicatorBaseType
{
    [XmlAttribute]
    public XmlQualifiedName id { get; set; }

    [XmlAttribute]
    public string version { get; set; }
}

public class ControlledVocabularyStringType
{
    public string vocab_name { get; set; }

    public string vocab_reference { get; set; }

    [XmlText]
    public string Value { get; set; }
}

我的反序列化代码:

using (var stream = new StreamReader("Test.xml"))
{
    var xml = new XmlSerializer(typeof(STIX_Package));

    return (STIX_Package) xml.Deserialize(stream);
}

反序列化产生错误:

"System.InvalidOperationException: XML 文档中存在错误 (3, 10)。 ---> System.InvalidOperationException:指定的类型是 无法识别:name='IndicatorType', 命名空间='http://stix.mitre.org/Indicator-2',位于 http://stix.mitre.org/stix-1'>。”

如何构建/注释我的 POCO,以便可以反序列化上述 XML?

【问题讨论】:

  • 可能是因为您将IndicatorType类注释为“XmlType”Indicator?
  • @Nattrass 从 IndicatorType 类中删除 XmlType 属性后,我仍然得到与上述相同的错误。
  • 您可以尝试使用 xsd.exe 从您的 xml 创建架构,然后再次使用 xsd.exe 从架构中派生一个类
  • @Nattrass 尝试通过 xsd.exe、xsd2code 和选择性粘贴来生成类定义 -> 在 Visual Studio 中将 XML 粘贴为类,但没有成功。

标签: c# xml


【解决方案1】:

好的,我已经设法通过更改 IndicatorType 类来反序列化您的 xml。 我已经更改了 IndicatorType 类的命名空间和 Type 属性的命名空间

[XmlRoot(ElementName = "Indicator")]
[XmlType(Namespace = "http://stix.mitre.org/Indicator-2", TypeName = "IndicatorType")]
public class IndicatorType : IndicatorBaseType
{
    [XmlElement("Title", Namespace = "http://stix.mitre.org/Indicator-2")]
    public string Title { get; set; }

    [XmlElement("Type", Namespace = "http://stix.mitre.org/default_vocabularies-1")]
    public List<ControlledVocabularyStringType> Type { get; set; }

    [XmlElement("Description", Namespace = "http://stix.mitre.org/Indicator-2")]
    public string Description { get; set; }

    [XmlAttribute, System.ComponentModel.DefaultValueAttribute(false)]
    public bool negate { get; set; }
}

如果您检查 XML,您可以看到元素位于不同的命名空间中。这些是在 XML 的根元素中定义的

<stix:Indicator xsi:type="indicator:IndicatorType"> <---HERE
  <indicator:Title>admin on 24th September 2014 - (1) FileObjects</indicator:Title>
  <indicator:Type xsi:type="stixVocabs:IndicatorTypeVocab-1.0">Exfiltration</indicator:Type> <--- HERE
  <indicator:Description>Some Ex filtration Happened</indicator:Description>
</stix:Indicator>

【讨论】:

  • 我正在努力解决同样的问题,但没有运气。所以我决定把它作为另一个问题发布,因为它太长了,不能写成评论。这是问题:stackoverflow.com/questions/52775320/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多