Xml 如何读取节点中子节点的属性?

Xml 如何读取节点中子节点的属性?,xml,c#,winforms,Xml,C#,Winforms,我正在尝试读取一个文件,我想执行以下操作: 一个组合框,将显示列表中的所有蔬菜名称 选择蔬菜后,第二个组合框将在中显示菜谱名称,可以使用第一个组合框中选择的蔬菜进行烹饪 最后,使用OK按钮,所选配方将读取指向配方的文件路径 我写的XML C:\\ D:\\ E:\\ F:\\ C#代码 public Form1() { 初始化组件(); Load(“Recipe_List.xml”); } XmlDocument xDoc=新的XmlDocument(); 私有void Form1\u加载(

我正在尝试读取一个文件,我想执行以下操作:

  • 一个
    组合框
    ,将显示列表中的所有蔬菜名称
  • 选择蔬菜后,第二个
    组合框
    将在中显示菜谱名称,可以使用第一个
    组合框
    中选择的蔬菜进行烹饪
  • 最后,使用OK按钮,所选配方将读取指向配方的文件路径
  • 我写的XML
    
    C:\\
    D:\\
    E:\\
    F:\\
    
    C#代码
    public Form1()
    {
    初始化组件();
    Load(“Recipe_List.xml”);
    }
    XmlDocument xDoc=新的XmlDocument();
    私有void Form1\u加载(对象发送方、事件参数e)
    {
    XmlNodeList vegets=xDoc.GetElementsByTagName(“蔬菜”);
    for(int i=0;i

    第一个
    组合框
    现在可以显示蔬菜名称,但是如何让第二个
    组合框
    根据文件读取菜谱?

    首先,您不会将解析后的XML存储在任何地方。因此,在
    Combox1\u SelectedIndexChanged
    中,您无法使用它。您应该在表单中引入私有字段(或属性,无论什么),而不是
    xDoc
    局部变量

    如果出于某种奇怪的原因想继续使用XML文件,则必须在
    comboBox1\u SelectedIndexChanged
    中查找所选的
    元素,然后处理其所有子
    元素。然而,这是不必要的复杂。更好的方法是从声明数据结构和使用开始


    您将得到两个类,
    蔬菜
    配方
    ,用于序列化(存储到XML)和反序列化(从XML读取)您的数据。在表单中,您将使用对象,而不必手动使用XML。

    您可以构建以下Xpath,然后获得蔬菜的配方

    string xpath = string.Format("//vegetable[@name='{0}']/recipe",comboboxSelectedItem);
    var selectedVegetableRecipe = xdoc.SelectSingleNode(xpath);
    

    然而,正如Ondrej Tucny所指出的,在应用程序启动期间,您可以将xml文档缓存在静态XMLDocument中,然后将其用于代码中,以避免每次调用的性能开销。

    您的意思是这样的吗?我对C#很陌生,对它不是很熟悉。是的,你将把你的价值放在
    组合框selecteditem
    的位置。这将执行搜索,并为您获取所选变量的配方。请尝试此方法并在此处发布您的更新。很高兴知道我走的是正确的道路,但另一个问题是,您向我建议的方法存在语法错误,我无法调试。哦,不~~~我真蠢。我已经更新了帖子。现在试试看。。。我也很愚蠢。。在
    comboboxSelectedItem
    之后不需要报价。我尝试删除报价,但我该如何处理selectedVegetableRecipe?我试图用messagebox.show来显示它,但由于它是一个变量,所以无法进行比较。有什么建议吗?
    public Form1()
    {
        InitializeComponent();            
        xDoc.Load("Recipe_List.xml");
    }
    
    XmlDocument xDoc = new XmlDocument();
    
    private void Form1_Load(object sender, EventArgs e)
    {
        XmlNodeList vegetables = xDoc.GetElementsByTagName("Vegetable");
        for (int i = 0; i < vegetables.Count; i++)
        {
            comboBox1.Items.Add(vegetables[i].Attributes["name"].InnerText);
        }
    }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //I'm lost at this place.
    }
    
    string xpath = string.Format("//vegetable[@name='{0}']/recipe",comboboxSelectedItem);
    var selectedVegetableRecipe = xdoc.SelectSingleNode(xpath);