2016-08-03 6 views
0

Я начал сегодня работать с XML-файлом на C#, и я действительно не знаю, как выполнить эту задачу.Показать в ListBox.Text содержимое файла 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> 

И я хочу показать в ListBox в следующем формате:

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 отсутствуют?

ответ

0

Вы пытаетесь пересечь детей узла. Если вы хотите сделать это, вы не должны использовать выражение XPath, которое снова рассматривает все узлы в документе.

В вашем xn.SelectNodes("/Units/Unit/SRC"); вы пытаетесь выбрать дочерние узлы SRC узла xn. Но вместо этого вы говорите 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); 
    } 
} 
+0

спасибо большое! работает! –

Смежные вопросы