在标签中显示xml信息

时间:2012-03-17 15:52:22

标签: c# xml winforms

Bassicly我可以正确地将我的xml文件加载到列表视图中,但我希望用户能够单击列表视图中的项目以及它们显示的信息,这些信息不是列表视图中的项目,而是xml。
所以我想我可以在用户点击项目时加载一个xml并以某种方式获取该信息,但它不会在标签上显示任何内容。任何帮助将不胜感激。

XML:

<?xml version = "1.0" encoding="utf-8"?>
<project>
  <test>
    <code>ss</code>
    <name>test</name>
  </test>

  <test>
    <code>ss1</code>
    <name>test1</name>
  </test>
</project>

代码:

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;

namespace form
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    XmlTextReader reader = new XmlTextReader("XMLfile1.xml");
    XmlNodeType type;

    while (reader.Read())
    {
        type = reader.NodeType;
        if (type == XmlNodeType.Element)
        {
            if (reader.Name == "name")
            {
                reader.Read();
                listView1.Items.Add(reader.Value);
            }
        }
    }
    reader.Close();


    }

    private void Form1_Load(object sender, EventArgs e)
    {


    }

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {


        XmlTextReader reader = new XmlTextReader("XMLFile1.xml");
        XmlNodeType type;

        while (reader.Read())
        {
            type = reader.NodeType;

            if (type == XmlNodeType.Element)
            {
                if (reader.Name == "test")
                {
                    reader.Read();
                    codelabel.Text = "s";
                }


            }
        }
    }

    private void groupBox2_Enter(object sender, EventArgs e)
    {

    }
}
}

3 个答案:

答案 0 :(得分:1)

使用these extensions

写:

protected string GetName(string code)
{
    var item = XElement.Load("XMLfile1.xml").GetEnumerable("test", x =>
            new
            {
                Code = x.Get("code", string.Empty),
                Name = x.Get("name", string.Empty)
            })
            .FirstOrDefault(i => i.Code == code);
    if(null != item)
        return item.Name;
    return "Item not found";
}

这将从文件中查找列表,检查每个列表,直到找到正确的代码,然后返回name值。然后将该值放在您的控件中。如果我错误地按名称搜索,只需将FirstOrDefault行中的代码与return item.Name行交换。

答案 1 :(得分:0)

创建一个模仿文件中数据的类。像:

public class Project
{
    public string Code { get; set; }
    public string Name { get; set; }
}

然后,您将把XML文件读入最终成为List的内容。看一下本教程:

Simple XML Parsing

private List<Project> _projects;

然后,您可以将列表中的数据添加到ListView。

foreach(Project proj in _projects)
{
    listView1.Items.Add(proj.Name); 
}

在ListView SelectedIndexChanged中,您可以访问List的正确索引以显示标签的正确值。

 codeLabel.Text = _projects[listView1.FocusedItem.Index].Code;

答案 2 :(得分:0)

Value节点的test属性为空(它只包含子节点,没有文本)。
我认为你应该改变你的代码来累积文本(带声明,你可以在MSDN上看到一个例子)从测试开始直到你读到它的结束标记。

作为替代方案(如果XML文件不大),您可以考虑使用LINQ to XML或仅使用XmlDocument(它更容易阅读,您可以始终拥有InnerXml任何节点)。例如,您可以查看此article on CodeProject

有关您可以执行的解析XML的简短列表,您可以阅读this article(我认为这不是很好,但至少它是...列表)。