3

単純なXMLファイルがあり、そこから2つの要素の内部テキストを抽出し、それらをListViewの2列にテキストをリストするメソッドに渡す必要があります。1つの要素からテキストを抽出するように機能していますが、2番目の列に2番目の要素のデータを入力する方法を理解するのに苦労しています。

XMLファイル:

<?xml version="1.0"?>
<Projects>
  <Project>
    <ProjectName>Test project1</ProjectName>
    <ProjectType>MSWORD</ProjectType>
  </Project>
  <Project>
    <ProjectName>MyNewProject</ProjectName>
    <ProjectType>SGML</ProjectType>
  </Project>
  <Project>
    <ProjectName>NewProject3</ProjectName>
    <ProjectType>XML</ProjectType>
  </Project>
  <Project>
    <ProjectName>Jake'sProject</ProjectName>
    <ProjectType>SGML</ProjectType>
  </Project>
  <Project>
    <ProjectName>P3_test</ProjectName>
    <ProjectType>SGML</ProjectType>
  </Project>
</Projects>

要素をロードおよび抽出するメソッド:

private void openProjectToolStripMenuItem_Click(object sender, EventArgs e)
{
    Projects myProjects = new Projects(this); 

    myProjects.Show(); //displays the Form 2 (called Projects)

    XmlDocument xdoc = new XmlDocument();
    xdoc.Load("O:\\TestDaws\\projects.xml");

    string projList = "/Projects/Project";

    XmlNodeList xname = xdoc.SelectNodes(projList + "/ProjectName");
    XmlNodeList xtype = xdoc.SelectNodes(projList + "/ProjectType");

    foreach (XmlNode xNodeName in xname)
    {
        myProjects.buildProjectList(xNodeName.InnerText.ToString());
    }
}

そして最後に、listViewを構築する2番目の形式の方法:

public void buildProjectList(string project)
{
    ListViewItem projItem = new ListViewItem(project);

   // projItem.SubItems.Add("--");
    listView1.Items.Add(projItem);
}

誰かが私がこれを達成する方法を教えてもらえますか?2番目の形式のメソッドに要素の1つ(xname)のみを渡していることがわかります。しかし、どうすればもう一方を渡すことができますか?別のforeachがありますか?私ができる必要があるのは、xname変数とxtype変数の両方を2番目の形式のメソッドに渡すことですが、それを行うための最良の方法がわかりません。

4

3 に答える 3

0

EaterOfCorpsesの回答を次のように変更すると、機能します

XmlNodeList xprojects = xdoc.SelectNodes("//Project");

projectname = xProjectAttr.InnerText;
projecttype = xProjectAttr.InnerText;
于 2013-03-05T07:42:19.967 に答える
0

これが解決策だと思います。異なる配列に型と名前がないため、これもより安全です。

XmlNodeList xprojects = xdoc.SelectNodes(projList);

foreach (XmlNode xProject in xprojects)
{
    string projectname = "";
    string projecttype = "";
    foreach(XmlNode xProjectAttr in xProject){
        switch(xProjectAttr.Name){
            case "ProjectName":
                projectname = xProjectAttr.Value;
                break;
            case "ProjectType":
                projecttype = xProjectAttr.Value;
                break;
        }
    }
    myProjects.buildProjectList(projectname,type);
}

そしてあなたの他の機能は

public void buildProjectList(string project,string type)
{
   ListViewItem projItem = new ListViewItem(project);

   projItem.SubItems.Add(type);
   listView1.Items.Add(projItem);
}

編集

少し編集しました。私は XPath が苦手なので、それが問題だったと思います。このセットアップでは、ProjectType または ProjectName を見逃した場合、1 つもせずに続行し、例外をスローします。

于 2013-02-14T10:42:26.793 に答える