Как мне сделать класс сериализации для этого? - PullRequest
0 голосов
/ 04 мая 2010

У меня что-то вроде этого (извините за плохие имена)

   <?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="http://www.domain.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.domain.com Schema.xsd">
      <product></product>
      <SomeHighLevelElement>
         <anotherElment>
              <lowestElement> </lowestElement>
         </anotherElment>
      </SomeHighLevelElement>
    </root>

У меня есть что-то подобное для моего класса

public class MyClass
{
    public MyClass()
    {
        ListWrapper= new List<UserInfo>();
    }


    public string product{ get; set; }


    public List<SomeHighLevelElement> ListWrapper{ get; set; }


}

public class SomeHighLevelElement
{

    public string lowestElement{ get; set; }
}

Но я не знаю, как написать код для "anotherElement", не уверен, должен ли я сделать еще одну обертку вокруг него.

Редактировать

Я знаю, что получаю ошибку в моем реальном XML-файле. У меня есть это в моем теге

xmlns="http://www.domain.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Domain.com Schema.xsd

Создает исключение в корневой строке, сообщающее, что с этим материалом произошла ошибка. Так что я не знаю, злится ли это на schemaLocation, поскольку я сейчас использую локальный хост или что.

Error

System.InvalidOperationException was caught
  Message="There is an error in XML document (2, 2)."
  Source="System.Xml"

1 Ответ

2 голосов
/ 04 мая 2010

Вот простой пример, основанный на предоставленной вами информации. По сути, вам нужно будет создать отдельный класс для anotherElment, который содержит string.

Вы можете точно контролировать, как ваш класс анализирует элементы Xml, используя атрибуты , которые в основном отображают свойства вашего класса на элементы / атрибуты в файле Xml. Так, например, поскольку ваш элемент документа в предоставленном вами примере Xml - root, я явно определяю, что MyClass имеет элемент документа с именем root, соответствующий вашему XML. По умолчанию, сериализатор будет искать элемент с именем MyClass, и если вы его опустите, метод десериализации будет выбрасывать.

Это должно помочь вам начать:

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("root")]
public class MyClass
{
    public MyClass()
    {

    }

    public string product { get; set; }

    [XmlElement("SomeHighLevelElement")]
    public List<SomeHighLevelElement> ListWrapper { get; set; }

}

public class SomeHighLevelElement
{
    public AnotherElment anotherElment { get; set; }
}

public class AnotherElment
{
    public string lowestElement { get; set; }
}

И пример теста на основе предоставленного вами XML:

using System.Xml;
using System.Xml.Serialization;
using System.IO;
.
.
.
public void Test()
{
    string xml = @"<root>
                  <product>product name</product>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>foo</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>bar</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>baz</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                </root>";
    MyClass c = Deserialize<MyClass>(xml);
}

public T Deserialize<T>(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    return (T)serializer.Deserialize(new StringReader(xml));
}
...