簡體   English   中英

從 xml 獲取唯一值

[英]Getting unique values from xml

我有這種 xml 文件。 根節點是 Sim 並且有多個“測試”子節點。 此外,每個“測試”都有一位講師。 最后,每個講師都有自己的名字、姓氏和等級值。

<Sim>
  <Test ID="1" Description="test1" Date="17/01/2023">
    <Instructor Num="1">
      <Name>instructor1</Name>
      <Surname></Surname>
      <Rank></Rank>
    </Instructor>
  </Test>
  <Test ID="2" Description="test2" Date="16/01/2023">
    <Instructor Num="22">
      <Name>instructor22</Name>
      <Surname></Surname>
      <Rank></Rank>
    </Instructor>
  </Test>
</Sim>

我想為組合框提供唯一的講師 IDS。 使用此代碼,我可以獲得所有講師 ID,但它們不是唯一的。 例如,如果兩個測試有相同的講師,它會在 combobox 上顯示 2 個講師。另外,在選擇 combobox 之后,我想將所選講師的姓名和等級存儲在臨時變量中。 我該如何解決這個問題?

XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNodeList insList = doc.SelectNodes("Sim/Test/Instructor");
foreach (XmlNode xn in insList)
   cBox_ins.Items.Add(xn.Attributes["Num"].Value);

問正確的問題。 您的任務不僅僅是獲得唯一的講師編號,還要保存數據以備將來使用。

讓我們這樣做吧。
創建一個 model class 用於存儲數據:

public class Instructor
{
    public int Num { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Rank { get; set; }
}

和一個輔助比較器 class:

public class InstructorComparer : IEqualityComparer<Instructor>
{
    public bool Equals(Instructor x, Instructor y)
    {
        return x.Num == y.Num;
    }
    public int GetHashCode(Instructor obj)
    {
        return obj.Num;
    }
}

這是一個完整的示例應用程序:

public partial class Form1 : Form
{
    ComboBox _comboBox;
    List<Instructor> _instructors;

    public Form1()
    {
        //InitializeComponent();

        var set = new HashSet<Instructor>(new InstructorComparer());
        var xml = XElement.Load("test.xml");
        foreach (var node in xml.Elements("Test").Elements("Instructor"))
        {
            var instructor = new Instructor
            {
                Num = (int)node.Attribute("Num"),
                Name = node.Element("Name").Value,
                Surname = node.Element("Surname").Value,
                Rank = node.Element("Rank").Value
            };
            set.Add(instructor);
        }

        _instructors = set.ToList();

        _comboBox = new ComboBox { Parent = this, Dock = DockStyle.Left };
        _comboBox.SelectedValueChanged += _comboBox_SelectedValueChanged;
        _comboBox.DisplayMember = nameof(Instructor.Num);
        _comboBox.DataSource = _instructors;
    }
    private void _comboBox_SelectedValueChanged(object sender, EventArgs e)
    {
        var comboBox = (ComboBox)sender;
        var instructor = (Instructor)comboBox.SelectedValue;
        Text = instructor.Name + " " + instructor.Surname + " " + instructor.Rank;
    }
}

從 xml 文件加載數據。 我正在使用 linq 到 xml,但它也可以通過反序列化來完成。
我們使用帶有比較器的中間 HashSet 來獲取不同的數據。
我們將數據保存為表單字段中的列表,以便我們稍后訪問它。
綁定數據到combobox,指定combobox顯示什么。

在這種情況下,我們從 combobox 接收綁定數據並以某種方式使用它。 我只是將它們放在表單的 Text 屬性中。

命名空間:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;

對於來自 xml 個節點的 select 個獨特的講師,你可以這樣做:

...your code to load XML
var instructors = insList.Cast<XmlNode>().DistinctBy(x => x.Attributes["Num"].Value);

foreach (XmlNode node in instructors)
{
   cBox_ins.Items.Add(xn.Attributes["Num"].Value);
}

要解決存儲所選講師詳細信息的第二個問題,您可能需要一個存儲所有講師的查找表,然后您可以通過選定的 Id 檢索講師。

這是客戶端代碼的實現

cBox_ins.Items.AddRange(doc.SelectNodes("Sim/Test/Instructor")
        .OfType<XmlNode>().Select(x => x.Attributes["Num"].Value)
        .Distinct().ToArray());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM