C#中的XMl解串器

时间:2011-04-11 15:25:23

标签: c# xml-serialization

我有以下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 个答案:

答案 0 :(得分:3)

您可以使用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);
        }
    }
}

答案 1 :(得分:2)

我不会写你的代码。看看http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx并编写一个可能符合您需求的类,并将其序列化。熟悉用于控制序列化的属性,并按照示例的方式调整类的序列化。然后你也可以用它进行反序列化。

当然还有其他选项可以从XML中读取数据,但我不会记录所有这些数据。显然你也可以使用XmlDocument,XDocument,XmlReader,......或任何符合你要求的东西“手动”阅读数据。

答案 2 :(得分:1)

答案 3 :(得分:1)

您无法真正进行选择性反序列化,但您可以在将结果反序列化为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;