Десериализатор XMl в C # - PullRequest
       1

Десериализатор XMl в C #

2 голосов
/ 11 апреля 2011

У меня есть следующий XML, и я хочу только десериализовать потоки Product1, какой будет синтаксис в C #?Благодарю.Я не смог найти документацию онлайн.

<ArrayOfProductData>
- <ProductData>
  <ProductName>product1</ProductName> 
  <ProductID>1</ProductID> 
- <Streams>
  <productId>1</productId> 
  <name>current stream</name> 
  <id>1</id> 
  </Streams>
- <Streams>
  <productId>1</productId> 
  <name>stream 1.1</name> 
  <id>2</id> 
  </Streams>
  </ProductData>
- <ProductData>
  <ProductName>product2</ProductName> 
  <ProductID>2</ProductID> 
- <Streams>
  <productId>2</productId> 
  <name>current stream</name> 
  <id>1</id> 
  </Streams>
- <Streams>
  <productId>2</productId> 
  <name>stream 1.2</name> 
  <id>2</id> 
  </Streams>
  </ProductData>
  </ArrayOfProductData>

Ответы [ 4 ]

3 голосов
/ 11 апреля 2011

Вы можете использовать XDocument и XPath для фильтрации:

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;

public class ProductStream
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public string Name { get; set; }
}

class Program
{
    static void Main()
    {
        var streams = XDocument
            .Load("test.xml")
            .XPathSelectElements("//ProductData[ProductID='1']/Streams")
            .Select(s => new ProductStream
            {
                Id = int.Parse(s.Element("id").Value),
                ProductId = int.Parse(s.Element("productId").Value),
                Name = s.Element("name").Value
            });

        foreach (var stream in streams)
        {
            Console.WriteLine(stream.Name);
        }
    }
}
2 голосов
/ 11 апреля 2011

Я не буду писать ваш код.Взгляните на http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx и напишите класс, который может соответствовать вашим потребностям, и сериализуйте его.Ознакомьтесь с атрибутами, используемыми для управления сериализацией, и настройте сериализацию своего класса так, как выглядит ваш пример.Тогда вы сможете использовать его и для десериализации.

Конечно, есть и другие варианты для чтения данных из XML, но я не буду документировать их все.Очевидно, что вы также можете читать данные «вручную», используя XmlDocument, XDocument, XmlReader и т. Д. Или все, что соответствует вашим требованиям.

1 голос
/ 11 апреля 2011

Вы не можете сделать выборочную десериализацию, но вы можете отфильтровать результаты после того, как они были десериализованы в объект типа XDocument.EG:

using System.Xml.Linq;

XDocument myDoc = XDocument.Load("myfile.xml");

var prod1Streams = from e in XDocument.Root.Elements("Streams")
                   where e.Element("productId") != null
                   && e.Element("productId").Value == "1"
                   select e;
1 голос
/ 11 апреля 2011
...