2016-10-12 3 views
3

複数のアイテムを持つXMLファイルがあります。すべてをリストするのではなく、特定のリストを1つずつデシリアライズしたい。 this siteから例を使用してXMLから特定のアイテムのみをデシリアライズしてリストに追加

は、どのように私はId=2のみProductをデシリアライズし、productListに追加しますか?

クラス:

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

コード:

void foo() 
{ 
string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name></Product><Product><Id>2</Id><Name>My second product</Name></Product></Products>"; 

XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products")); 

StringReader stringReader = new StringReader(xmlString); 

List<Product> productList = (List<Product>)serializer.Deserialize(stringReader); 
} 
+0

LINQ to XMLなどのXMLパーサーを使用しないのはなぜですか? – Tim

答えて

2

は、XMLを照会するXDocumentクラスを使用することができます。

StringReader stringReader = new StringReader(xmlString); 
XDocument document = XDocument.Load(stringReader); 

var node = document.Descendants("Product").FirstOrDefault(p => p.Descendants("Id").First().Value == "2"); 
if(node != null) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(Product)); 
    var xmlReader = new StringReader(node.ToString()); 
    Product result = serializer.Deserialize(xmlReader) as Product; 
} 

は確かに、これは特定の状況のた​​めにさらなる分析が必要な場合があります迅速かつ汚いソリューションです。

+0

ありがとう、それはうまく動作します! – Caliber

1

ここでは、この作業は、あなたがあなたにStringReaderでXmlReaderを作成し、要素のサブツリーを読むべきです。これはReadSubtreeメソッドで実現できます。

public static void Main(string[] args) 
    { 
     string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name></Product><Product><Id>2</Id><Name>My second product</Name></Product></Products>"; 

     XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products")); 
     List<Product> productList = new List<Product>(); 

     using (StringReader stringReader = new StringReader(xmlString)) 
     using (XmlReader xmlReader = XmlReader.Create(stringReader)) 
     { 
      xmlReader.ReadToDescendant("Products"); 
      productList = (List<Product>)serializer.Deserialize(xmlReader.ReadSubtree()); 
     } 

    } 
+0

ありがとうございますが、私の例のコードのように、 'Id = 2'だけでなく、両方の項目を逆シリアル化します。 – Caliber

関連する問題