C# オブジェクトに逆シリアル化したい次の形式の xml を含むストリームがあります。
<?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 を機能させるために属性に入れるべきものを誰かが助けることができれば、それは素晴らしいことです.
どんな助けでも感謝します、ありがとう。