XML преобразование в объект c # - PullRequest
2 голосов
/ 20 апреля 2010

Если у меня есть xml вида

<Details>
<Detail>
<Name1>Value1</Name1>
<Name2>Value2</Name2>
</Detail>
...
</Details>

И я определяю класс в своем коде c # для Detail и предоставляю установщики / получатели для Name1, Name2 и т.д. Есть ли API для непосредственного чтения XML и создания объектов Detail.

Ответы [ 5 ]

4 голосов
/ 20 апреля 2010

посмотрите на XmlSerializer - это создает / анализирует xml по форме вашего объекта (поэтому имена ваших свойств должны совпадать с именами атрибутов / элементов в xml).

Если вам нужно больше контроля, вам нужно работать с более новым Linq to XML API

XSD.exe может создать для вас файл класса на основе файла XSD или XML, но если вы нацеливаете его на файл XML, вам понадобится симпатичный представитель один (с несколькими элементами везде, где может быть несколько элементов), в противном случае вам придется настроить несколько вещей. Это хорошее начало, хотя ...

2 голосов
/ 20 апреля 2010

Linq to XML довольно хорош для этого.

var details = from detail in document.Descendants("Detail")
              select new Detail { Name1 = detail.Element("Name1").Value, Name2 = detail.Element("Name2").Value };

(Предполагается, что вы определили тип с именем Detail, вы вполне можете опустить Detail и получить анонимный тип.)

Этот код приведет к IEnumarable<Detail> (или анон. Типу), который вы можете перебрать для своих объектов.

1 голос
/ 20 апреля 2010

Вы также можете использовать DataContractSerializer.

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

0 голосов
/ 20 апреля 2010

Используйте этот код:

DetailList dl;
XmlSerializer xmls = new XmlSerializer(typeof(List<DetailList>))

using (Stream fs = new FileStream(@"C:\path\to\file.xml", FileMode.Open))
      dl = (DetailList)xmls.Deserialize(fs);

Убедитесь, что ваши классы заполнены правильными атрибутами. Используйте

using System.Xml.Serialization;

// ...

[Serializable]
public class Detail
{
    [XmlElement]
    public string Name1 { get; set; }
    [XmlElement]
    public string Name2 { get; set; }

    // REQUIRED: a parameterless constructor for XmlSerializer (can be private)
    private Detail(){}

    public Detail(string name1, string name2)
    {
        Name1 = name1;
        Name2 = name2;
    }
}

[Serializable, XmlRoot("Details")]
public class DetailList : List<Detail>
{

}
0 голосов
/ 20 апреля 2010
  1. Вам нужно будет использовать XSD.exe для создания класса C # из файла XML - подробности см. в этом посте .
  2. Используйте XmlSerializer для десериализации класса:

    XmlSerializer serializer = new XmlSerializer(typeof(Details));  
    using (var fs = new FileStream(filename, FileMode.Open))  
    {  
        XmlReader reader = XmlReader.Create(fs);  
        var result = (Details)serializer.Deserialize(reader);  
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...