3

我有一个简单的 XML 文件,我需要从中提取 2 个元素的内部文本并将它们传递给在 ListView 的 2 列中列出文本的方法。我让它工作,以便它从元素 1 中提取文本,但我很难理解如何让它用来自第二个元素的数据填充第二列。

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的第二种形式的方法:

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

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

谁能告诉我我是如何做到这一点的?我可以看到我只是将其中一个元素(xname)传递给第二种形式的方法。但是我如何传递另一个?有单独的 foreach 吗?我需要做的是将 xname 和 xtype 变量都传递给第二种形式的方法,但我不知道最好的方法。

4

3 回答 3

0

In EaterOfCorpses's answer change the following, it will work

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

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

上定义了一个索引器XmlNodeList,因此您可以使用简单的 for:

for (int i=0; i<xname.Count; i++)
{
   XmlNode xNodeName = xname[i];
   XmlNode xNodeType = xtype[i];

   myProjects.buildProjectList(xNodeName.InnerText.ToString(), 
                               xNodeType.InnerText.ToString());
}

此代码假定xnameandxtype列表将始终是并行的。

当然,您应该将其更改为buildProjectList

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

    listView1.Items.Add(projItem);
}
于 2013-02-14T10:38:27.847 回答
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 不好,所以我认为这是问题所在

于 2013-02-14T10:42:26.793 回答