Десериализовать фрагмент XML в класс, созданный xsd.exe

У меня есть файл xml, который я хочу прочитать, а затем интерпретировать и преобразовать в соответствующие классы, созданные с помощью инструмента xsd. Вот шаги, которые я пытаюсь:

  1. Я создал файл XSD.
  2. Преобразовал соответствующий файл xsd в соответствующий набор классов.
  3. Я сделал несколько файлов xml с помощью того же набора классов (из шага 2) и xmlserializer.
  4. Теперь я читаю эти файлы xml и не хочу преобразовывать их в классы (созданы на шаге 2)

Я вставляю код, с которым работал до сих пор, кажется, я получаю исключение при десериализации, {"Ошибка в XML-документе (0, 0)".

            var doc = XDocument.Load(filePath);

        var query2 = from b in doc.Root.Descendants()
                     select b;

        foreach (var item in query2)
        {
            switch (item.Name.LocalName)
            {
                case "SomeStringValue": 
                    XmlSerializer srz = new XmlSerializer(typeof(SomeClassGeneratedfromXSD));
                    var writer=item.CreateReader();
                    parameterFromFile.SomeProperty = (SomeClassGeneratedfromXSD)srz.Deserialize(writer);
                    //srz.Deserialize(item);
                    break;

Я вставляю фрагмент того, как выглядел мой xsd:

<xs:complexType name="Parameters">
<xs:all>
  <xs:element name="A">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="mstns:Restricted8CharString">
          <xs:attribute name="Caption" use="required" fixed="Caption for A">
            <xs:simpleType>
              <xs:restriction base="xs:string"></xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="ActionWhenMaxReached" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:short">
                <xs:pattern value="[1-3]"></xs:pattern>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="Expression" type="xs:string" default="0" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="B">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:short">
          <xs:attribute name="Caption" use="prohibited">
            <xs:simpleType>
              <xs:restriction base="xs:string"></xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="ActionWhenMaxReached" use="required">
            <xs:simpleType>
              <xs:restriction base="xs:short">
                <xs:pattern value="[1-3]"></xs:pattern>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="Expression" type="xs:string" default="0" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  </xs:all>
  </xs:complexType>

person Devesh    schedule 30.03.2013    source источник


Ответы (2)


Ваш закрывающий тег неверен. Должен быть:

</xs:complexType>

и не

</xs:complexType name="Parameters">
person Jens Meinecke    schedule 30.03.2013
comment
Извините за опечатку, это ошибка, фактический xsd правильный. Я обновлю свой вопрос и исправлю эту ошибку. - person Devesh; 30.03.2013

После борьбы я нашел решение:

На самом деле я пытался разобрать внутренний элемент, что было неправильно; У меня уже были классы из инструмента xsd, поэтому я могу просто использовать код как:

XmlSerializer serializer = new XmlSerializer(typeof(RootClass));
        using (TextReader reader = new StreamReader(filePath))
        {
            RootClass parameterFromFile = (RootClass)serializer.Deserialize(reader);
        }
person Devesh    schedule 02.04.2013