我有一个简单的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());
}
}
最后我的第二种形式的mehod构建了listView:
public void buildProjectList(string project)
{
ListViewItem projItem = new ListViewItem(project);
// projItem.SubItems.Add("--");
listView1.Items.Add(projItem);
}
任何人都可以告诉我我是如何实现这一目标的吗?我可以看到我只是将其中一个元素(xname)传递给第二种形式的方法。但我如何通过另一个?有一个单独的foreach?我需要做的是将xname和xtype变量传递给第二种形式的方法,但我不知道最好的方法。
答案 0 :(得分:0)
indexer上定义了XmlNodeList
,因此您可以使用简单的:
for (int i=0; i<xname.Count; i++)
{
XmlNode xNodeName = xname[i];
XmlNode xNodeType = xtype[i];
myProjects.buildProjectList(xNodeName.InnerText.ToString(),
xNodeType.InnerText.ToString());
}
此代码假定xname
和xtype
列表始终是并行的。
当然,您应该将buildProjectList
更改为:
public void buildProjectList(string project, string type)
{
ListViewItem projItem = new ListViewItem(project+"-"+type);
listView1.Items.Add(projItem);
}
答案 1 :(得分: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,它将继续没有一个,现在抛出异常
答案 2 :(得分:0)
在EaterOfCorpses's answer中更改以下内容,它将起作用
XmlNodeList xprojects = xdoc.SelectNodes("//Project");
projectname = xProjectAttr.InnerText;
projecttype = xProjectAttr.InnerText;