我有一个包含以下格式的 xml 的流,我想将其反序列化为 C# 对象
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<OrganisationMetaData xmlns="urn:organisationMetaDataSchema">
<Organisations>
<Organisation>
<Code>XXX</Code>
<Name>Yyyyyy</Name>...
我已经用字符串完成了很多次,但是对于流,它会将命名空间属性附加到所有复杂元素。如果我只是删除 xmlns 属性,而忘记根据模式验证它,它只会附加一个空的 xmlns 属性。我遇到的问题是 XmlSerializer (?)中的 Deserialize 方法抛出一个错误,说它不需要该属性。我尝试使用 XmlRoot 和 XmlType 属性来装饰类,但这并没有改变任何东西。
这是我要反序列化的类
[XmlRoot(
ElementName = "OrganisationMetaData",
Namespace = "urn:organisationMetaDataSchema")]
public class OrganisationMetaData
{
public List<Organisation> Organisations { get; set; }
}
[XmlType(
TypeName = "Organisation",
Namespace = "urn:organisationMetaDataSchema")]
public class Organisation
{
public string Code {get; set;}
public string Name {get; set;}
}
这是用于完成工作的方法
public IList<Organisation> DeserializeOrganisations(Stream stream)
{
var serializer = new XmlSerializer(typeof(OrganisationMetaData));
var mappingAssembly = //Resource in another assembly
var schemas = new XmlSchemaSet();
schemas.Add(
"urn:organisationMetaDataSchema",
XmlReader.Create(
mappingAssembly.GetManifestResourceStream(
// An xml schema
)
)
);
var settings = new XmlReaderSettings()
{
ValidationType = ValidationType.Schema,
Schemas = schemas,
ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings
};
settings.ValidationEventHandler += settings_ValidationEventHandler;
var reader = XmlReader.Create(stream, settings);
var metaData= (OrganisationMetaData)serializer.Deserialize(reader);
return metaData.Organisations.ToList();
}
我已经使用 DataContractSerializer 尝试过这个,但这带来了它自己的学习机会,所以如果有人可以帮助我应该在属性中添加什么来让 XmlSerializer 工作,那就太好了。
任何帮助将不胜感激,谢谢。