Новичок xsd.exe - я создал свои .cs и .xsd, теперь как мне читать в xml?

Каков наилучший метод чтения XML-файла для экземпляра коллекции объекта .cs, созданного с помощью xsd.exe?

Я использовал xsd.exe для создания файла .xsd (схемы), а затем для создания файла .cs. Я выполнил шаги здесь: http://ctrlf5.net/?p=235, и это сработало отлично. .

Я не хочу использовать XmlReader и писать кучу кода для навигации по дереву документов, устанавливая по пути все общедоступные сеттеры. Мой XML-документ длинный и болезненный. Я просто хочу нажать на легкую кнопку и получить свою коллекцию. У новичка, которым я только что был потрясающий момент с xsd - как круто он сделал мой файл .cs - но если мне теперь нужно написать 500 строк кода для экземпляра моего класса - не круто. Имеет смысл только то, что теперь есть простой способ создать экземпляр моей коллекции, и я просто не знаю, что это такое и как это найти в Google. Сообщение обратно на этот вопрос, на который уже ответили, с радостью принимается.

Вот как выглядит мой xml и код:

<?xml version = "1.0" ?>
<MY_OBJECT>
  <UNIQUE_ID>ABC</UNIQUE_ID>
  <TYPE>TEST</TYPE>
  <CLASSALIST>
    <CLASSA>
      <A>0</A>
      <B>0</B>
      <C>2598960</C>
      <HS>
        <H>
          <DESCRIPTION>MYDESC</DESCRIPTION>
          <ADDITIONAL>0</ADDITIONAL>
        </H>
      </HS>
    </CLASSA>
  </CLASSALIST>
  <BONUSES>
    <BONUS>
      <BONUS_TYPE>Bonus Schedule</BONUS_TYPE>
      <BONUS_DATA>
        <ALPHA>1</ALPHA>
        <BETA>4</BETA>        
      </BONUS_DATA>
    </BONUS>
  </BONUSES>
  <REVISION>A</REVISION>
  <CONDITION>
    <GENERAL></GENERAL>
    <EXCEPTION></EXCEPTION>
  </CONDITION>
  <ACTIONABLE>True</ACTIONABLE>
  <VERSION>12345</VERSION>
  <COMMENTS></COMMENTS>
</MY_OBJECT>

Здесь я пытаюсь десериализовать в List‹>:

[Test]
public void AutoXmlSampleList()
{
    var xs = new XmlSerializer(typeof(List<MY_OBJECT>));
    List<MY_OBJECT> list;
    using (var reader = XmlReader.Create(_inputFilename2))
    {
        list = (List<MY_OBJECT>)xs.Deserialize(reader);
    }

    Assert.AreEqual("ABC", list[0].UNIQUE_ID);

}

Вот сообщение об ошибке:

System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'

и если я попытаюсь десериализовать не List‹>:

[Test]
public void AutoXmlSampleNotList()
{
    var xs = new XmlSerializer(typeof(MY_OBJECT));
    MY_OBJECT myObject;
    using (var reader = XmlReader.Create(_inputFilename2))
    {
        myObject = (MY_OBJECT)xs.Deserialize(reader);
    }

    Assert.AreEqual("ABC", myObject.UNIQUE_ID);

}

что приводит к аналогичной ошибке:

System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'

person sapbucket    schedule 02.11.2011    source источник
comment
Вы ищете XmlSerializer. См. другие сообщения Stackoverflow stackoverflow.com/questions/792976/   -  person Eric LaForce    schedule 02.11.2011
comment
Вы также не должны обязательно использовать xsd.exe. Если вы можете использовать классы, сгенерированные svcutil.exe, вам будет лучше.   -  person John Saunders    schedule 02.11.2011
comment
Просто десериализуйте MY_OBJECT, а не List<MY_OBJECT>.   -  person leppie    schedule 02.11.2011
comment
Разве это не будет просто список count == 1?   -  person sapbucket    schedule 03.11.2011
comment
Можно ли куда-нибудь загрузить сгенерированный код С# и/или схему XML? Проблема кажется тонкой :)   -  person leppie    schedule 03.11.2011
comment
Похоже, ответ здесь: stackoverflow.com/a/6341430/2343   -  person Sameer Alibhai    schedule 20.12.2011


Ответы (1)


person    schedule
comment
Томас, я получаю такое же сообщение об ошибке (ошибка CS0030 и т. д.). Может ли быть так, что автоматически созданный *.cs требует некоторых ручных правок? - person sapbucket; 02.11.2011
comment
@sapbucket, без понятия ... xsd.exe не поддерживает все функции XML-схемы, возможно, ваш XSD использует некоторые неподдерживаемые функции - person Thomas Levesque; 02.11.2011
comment
Почему List<T>, а не только T? Насколько я помню, XML имеет только один корневой объект. - person leppie; 02.11.2011
comment
@leppie, ОП сказал, что хочет создать экземпляр коллекции объекта .cs, поэтому я предположил, что XML содержит коллекцию. Но теперь, когда XML опубликован, кажется, что это один объект... - person Thomas Levesque; 03.11.2011