2016-08-03 3 views
0

今日、C#でXMLファイルを使用して作業を開始しましたが、実際にこの作業を行う方法はわかりません。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> 

をそして、私は次の形式でリストボックスに表示する:

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が再び表示され、なぜとdが欠落していますか?

答えて

0

ノードの子をトラバースしようとしています。これを行うには、文書内のすべてのノードを再度考慮する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); 
    } 
} 
+0

おかげでたくさん!それは働いている! –

関連する問題