反序列化XML时,无法识别指定的类型
本文关键字:类型 识别 XML 反序列化 | 更新日期: 2023-09-27 18:26:15
我正在尝试使用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",namespace='http://stix.mitre.org/Indicator-2',位于http://stix.mitre.org/stix-1'>。"
我如何构造/注释我的POCO,以便可以反序列化上面的XML?
好的,我已经通过更改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>