在ListBox.Text中显示XML文件内容
本文关键字:文件 XML 显示 ListBox Text | 更新日期: 2023-09-27 18:00:05
我今天开始使用C#中的XML文件,我真的不知道如何完成这项任务。
我有这个XML:
<Units>
<Unit>
<UNIT_NAME>First</UNIT_NAME>
<SRC>
<SRC_NAME>a</SRC_NAME>
<SUB_SRC_NAME>
<SUB_SRC_NAME_A>i_first_srt_alfa</SUB_SRC_NAME_A>
<SUB_SRC_NAME_A>i_first_srt_beta</SUB_SRC_NAME_A>
</SUB_SRC_NAME>
<SRC_NAME>b</SRC_NAME>
<SUB_SRC_NAME>
<SUB_SRC_NAME_A>alfa</SUB_SRC_NAME_A>
<SUB_SRC_NAME_A>beta</SUB_SRC_NAME_A>
</SUB_SRC_NAME>
</SRC>
<DOC>
<DOC_NAME>i_first_doc</DOC_NAME>
<SUB_DOC_NAME>
<SUB_DOC_NAME_A>alfa</SUB_DOC_NAME_A>
<SUB_DOC_NAME_A>beta</SUB_DOC_NAME_A>
</SUB_DOC_NAME>
</DOC>
<TST>
<TST_NAME>i_first_tst</TST_NAME>
<SUB_TST_NAME>
<SUB_TST_NAME_A>alfa</SUB_TST_NAME_A>
<SUB_TST_NAME_A>beta</SUB_TST_NAME_A>
</SUB_TST_NAME>
</TST>
</Unit>
<Unit>
<UNIT_NAME>Second</UNIT_NAME>
<SRC>
<SRC_NAME>c</SRC_NAME>
<SUB_SRC_NAME>
<SUB_SRC_NAME_A>alfa</SUB_SRC_NAME_A>
<SUB_SRC_NAME_A>beta</SUB_SRC_NAME_A>
</SUB_SRC_NAME>
<SRC_NAME>d</SRC_NAME>
<SUB_SRC_NAME>
<SUB_SRC_NAME_A>alfa</SUB_SRC_NAME_A>
<SUB_SRC_NAME_A>beta</SUB_SRC_NAME_A>
</SUB_SRC_NAME>
</SRC>
<DOC>
<DOC_NAME>i_first_doc</DOC_NAME>
<SUB_DOC_NAME>
<SUB_DOC_NAME_A>i_first_doc_alfa</SUB_DOC_NAME_A>
<SUB_DOC_NAME_A>i_first_doc_beta</SUB_DOC_NAME_A>
</SUB_DOC_NAME>
</DOC>
<TST>
<TST_NAME>i_first_tst</TST_NAME>
<SUB_TST_NAME>
<SUB_TST_NAME_A>i_first_tst_alfa</SUB_TST_NAME_A>
<SUB_TST_NAME_A>i_first_tst_beta</SUB_TST_NAME_A>
</SUB_TST_NAME>
</TST>
</Unit>
</Units>
我想以以下格式显示在列表框中:
First
First -- a
First -- b
Second
Second -- c
Second -- d
这是我当前的代码:
XmlNodeList xnUnitList = xml.SelectNodes("/Units/Unit");
foreach (XmlNode xn in xnUnitList)
{
string UNIT_NAME = xn["UNIT_NAME"].InnerText;
listBox1.Items.Add(UNIT_NAME);
XmlNodeList SRC =xn.SelectNodes("/Units/Unit/SRC");
foreach (XmlNode node in SRC)
{
string SRC_NAME = node["SRC_NAME"].InnerText;
listBox1.Items.Add(UNIT_NAME+"--" +SRC_NAME);
}
}
但结果是这样的
First
First -- a
First -- c
Second
Second -- a
Second -- c
为什么a
和c
再次出现,为什么b
和d
缺失?
您正试图遍历节点的子级。如果要这样做,就不应该再次使用考虑文档中所有节点的XPath表达式。
在xn.SelectNodes("/Units/Unit/SRC");
中,您正试图选择xn
节点的SRC
节点子节点。但是,您告诉SelectNodes
忘记所有这些,重新开始从根目录中选择节点。
两个小的变化修复你的代码:
XmlNodeList xnUnitList = xml.SelectNodes("/Units/Unit");
foreach (XmlNode xn in xnUnitList)
{
string UNIT_NAME = xn["UNIT_NAME"].InnerText;
listBox1.Items.Add(UNIT_NAME);
// select all Nodes under the current Node
// that are a child of SRC
// and have a name of SRC_NAME
XmlNodeList SRC =xn.SelectNodes("SRC/SRC_NAME");
foreach (XmlNode node in SRC)
{
// node is now a SRC_NAME so no further
// juggling needed, you have what you need
string SRC_NAME = node.InnerText;
listBox1.Items.Add(UNIT_NAME+"--" +SRC_NAME);
}
}