我有包含我想反序列化到C#以下格式的XML的Stream对象为什么XmlReader将名称空间uris附加到每个元素?
<?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的属性上,那就太好了。
任何帮助,将不胜感激,谢谢。
谢谢马克,我现在对此有点脑衰。我的xml没有你的字符串所具有的单引号。你将如何克服这个,像Replace(...)这样简单的事情? – 2010-03-04 12:24:59
我已经尝试过所有我能想到的东西,所以大约8个小时后,我已经放弃了DataContractSerializer,而在东方可以告诉我更多关于xml不喜欢的内容。感谢您的帮助Marc :) – 2010-03-04 15:04:25
@Mark - 单引号无关紧要。发布的代码应该反序列化你引用的xml。你可以发布(或电子邮件,如果你喜欢)你的课程?我很确定我可以告诉你什么是错的... – 2010-03-04 16:34:26