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加载(
组合框
,将显示列表中的所有蔬菜名称组合框
将在中显示菜谱名称,可以使用第一个组合框
中选择的蔬菜进行烹饪
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);