c# - 查询反序列化对象

标签 c# linq xml-deserialization

拥有包含汽车集合的 XML:

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
    <Cars>
        <Car>
            <StockNumber>1020</StockNumber>
            <Make>Nissan</Make>
            <Model>Sentra</Model>
        </Car>
        <Car>
            <StockNumber>1010</StockNumber>
            <Make>Toyota</Make>
            <Model>Corolla</Model>
        </Car>
        <Car>
            <StockNumber>1111</StockNumber>
            <Make>Honda</Make>
            <Model>Accord</Model>
        </Car>
        <Car>
            <StockNumber>2000</StockNumber>
            <Make>Maybach</Make>
            <Model>S 600</Model>
        </Car>
        <Car>
            <StockNumber>2001</StockNumber>
            <Make>Ferrari</Make>
            <Model>F355 Spider</Model>
        </Car>
    </Cars>
</CarCollection>

及其由 xsd.exe 生成的反序列化对象类:

//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.42000
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// Dieser Quellcode wurde automatisch generiert von xsd, Version=4.6.1055.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class CarCollection : object, System.ComponentModel.INotifyPropertyChanged {

    private CarCollectionCars[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Cars", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public CarCollectionCars[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
            this.RaisePropertyChanged("Items");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class CarCollectionCars : object, System.ComponentModel.INotifyPropertyChanged {

    private CarCollectionCarsCar[] carField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Car", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public CarCollectionCarsCar[] Car {
        get {
            return this.carField;
        }
        set {
            this.carField = value;
            this.RaisePropertyChanged("Car");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class CarCollectionCarsCar : object, System.ComponentModel.INotifyPropertyChanged {

    private string stockNumberField;

    private string makeField;

    private string modelField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string StockNumber {
        get {
            return this.stockNumberField;
        }
        set {
            this.stockNumberField = value;
            this.RaisePropertyChanged("StockNumber");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Make {
        get {
            return this.makeField;
        }
        set {
            this.makeField = value;
            this.RaisePropertyChanged("Make");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Model {
        get {
            return this.modelField;
        }
        set {
            this.modelField = value;
            this.RaisePropertyChanged("Model");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

我想查询 Car 类的 StockNumber、Make 和 Model。所以, 我从这段代码开始:

XmlSerializer ser = new XmlSerializer(typeof(CarCollection));
CarCollection cars;
using (XmlReader reader = XmlReader.Create(file))
{
    cars = (CarCollection)ser.Deserialize(reader);
    foreach (var item in cars.Items)
    {
        foreach (var carCollection in item.Car)
        {
            carPool.Add(new CarPool()
            {
                Make = carCollection.Make,
                Model = carCollection.Model,
                StockNumber = carCollection.StockNumber
            });
        }
    }
}

但是,我不喜欢这种嵌套的 for 循环。有谁知道如何使用 LINQ 更有效地查询这个?

最佳答案

Linq 和 SelectMany() 应该解决嵌套循环:

// not tested or compiled
using (XmlReader reader = XmlReader.Create(file))
{
    var cars = (CarCollection)ser.Deserialize(reader);

    carPool.AddRange(
       cars.Items.SelectMany(it => it.Car).Select(c => 
            new CarPool()
            {
                Make = c.Make,
                Model = c.Model,
                StockNumber = c.StockNumber
            }) );
}

关于c# - 查询反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55552040/

相关文章:

c# - 如何通过给节点id读取xml中的节点值

c# - 如何展平嵌套对象 (LINQ)

sql - 序列不包含任何元素 - LINQ、MVC、Average

c# - 如何在 C# 中将一个 Xml 节点替换为另一个 Xml 节点

c# - 网格的最优高密度二元空间划分

c# - 在 MembershipUserCollection 上使用 Linq

c# - Json.NET - 将 JSON 转换为 XML 并删除 XML 版本、编码?

C# XML 文件有错误 (2, 2)

ios - XML 去中心化在 Unity iOS 版本中不起作用,但在 Windows 中起作用

c# - 具有NEST的索引JsonObject具有空值