在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 

为什么ac再次出现,为什么bd缺失?

在ListBox.Text中显示XML文件内容

您正试图遍历节点的子级。如果要这样做,就不应该再次使用考虑文档中所有节点的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);
    }
}