Вот шаги, которые я предпринял для работы с XmlDocument, возвращаемым сторонней DLL.
- Я сохранил XmlDocument как SegmentationSummary.xml.
- Я использовал XSD.exe для создания SegmentationSummary.xsd.
- Я использовал XSD.exe для создания SegmentationSummary.cs.
Вот пример SegmentationSummary.cs. Обратите внимание, что ShmResult является представлением корневого узла.
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "omitted")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "omitted", IsNullable = false)]
public partial class ShmResult
{
private ShmResultDownloadDetail[] downloadDetailField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("DownloadDetail")]
public ShmResultDownloadDetail[] DownloadDetail
{
get
{
return this.downloadDetailField;
}
set
{
this.downloadDetailField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "omitted")]
public partial class ShmResultDownloadDetail
{
private string modelCodeField;
/// <remarks/>
public string ModelCode
{
get
{
return this.modelCodeField;
}
set
{
this.modelCodeField = value;
}
}
}
Теперь я хотел бы использовать это, чтобы прочитать XmlDocument и начать работать с классами в SegmentationSummary.cs. Вот код, который я написал:
private XmlDocument _document;
SegmentationSummary.ShmResult _Result;
private void LoadXML()
{
XmlReader xmlRdr = new XmlNodeReader(_document);
System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(SegmentationSummary.ShmResult));
_Result = (SegmentationSummary.ShmResult)s.Deserialize(xmlRdr);
}
Когда выполняется LoadXML (), я получаю исключения из этого разнообразия:
метод испытаний
SegmentationSummaryHandlerTest.TestMethod1
бросил исключение:
System.InvalidOperationException:
Невозможно создать временный класс
(Результат = 1). ошибка CS0030: невозможно
конвертировать тип
'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail []
в
'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail'
ошибка CS0029: не может быть неявно
конвертировать тип
'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail'
в
'MERC.AIRCAT.SHMCoreInterface.SegmentationSummary.ShmResultDownloadDetail []
Теперь в FAQ по http://msdn.microsoft.com/en-us/library/ms950721.aspx говорится следующее:
В: Как мне сериализовать коллекции
объекты?
A: XmlSerializer выдает
исключение, когда коллекция содержит
типы, которые не были объявлены
конструктор XmlSerializer. Вы
может:
Объявите типы сериализатору, передав Type [] с
типы ожидать в пределах
коллекция.
OR
- Реализация строго типизированной коллекции, полученной из
System.Collections.CollectionBase с
индексатор, соответствующий методу Add ().
Мой вопрос: что из этого является «лучшим» и как мне реализовать решение?