如何在XML中搜索并在C#中使用GridView显示结果?

时间:2014-05-04 17:07:58

标签: c# asp.net xml gridview

我有一个Employees的XML数据,我想解析这些数据,并在ASP.NET中使用C#在Gridview中显示它。

根据员工ID或公司ID或部门ID等搜索参数,我应该能够过滤数据并更新GridView。

在互联网上检查了几个链接,但没有任何内容符合这种特殊格式..是否有可能实现..(任何链接)代码都会有所帮助。

  <?xml version="1.0" encoding="utf-8"?>
      <Employees>
        <Employee>
          <Id> TG18-2002</Id>
          <Name> AAPM^Test^Patterns</Name>
          <Sex> O </Sex>
          <Company>
            <Id> 2.16</Id>            
            <Department>
              <Id> 2.16.124</Id>
              <Project>
                <Id> 2.16.124.113543</Id>
              </Project>
            </Department>
          </Company>
        </Employee>
        <Employee>
          <ID> TG18-2003</ID>
          <Name> AAPM^Test^Patt</Name>
          <Sex> O </Sex>
          <Company>
            <ID> 2.16</ID>            
            <Department>
              <ID> 2.16.124</ID>
              <Project>
                <ID> 2.16.124.113543</ID>
              </Project>
            </Department>
          </Company>
        </Employee>
        <Employee>
      </Employees>

注意:我正在尝试构建类似this

的内容

3 个答案:

答案 0 :(得分:1)

查看您引用的链接,我认为您最好创建一个Employee类并使用XML数据填充它。

这将允许您从您的视图中解析您的数据(在本例中为XML,但可能是任何内容)(在本例中为ASP.NET Web Forms,但也可以是任何内容),我觉得这很方便这些天很常见(MVVM等)。

另一个好处是,您可以将嵌套数据源(如XML)变得更加平坦,以使视图绑定更简单,例如,在您提供的示例中,您可以将公司字段作为外部Employee类的属性。

另一个好处是,如果/当您的视图变为响应时,您可以使视图模型的属性可观察,从而允许更新模型,立即更新您的视图。

所有这一切,这是一个显示您的Employee类的小片段,并从您提供的XML示例中填充它。我正在使用Linq to XML,但有很多方法可以做到这一点(适配器,读卡器,导航器......)。

我认为重要的是你要从视图中分离数据。

class Employee
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }
    public Company Company { get; set; }
}

class Company
{
    public string Id { get; set; }
    public Department Department { get; set; }
}

class Department
{
    public string Id { get; set; }
    public Project Project { get; set; }
}

class Project
{
    public string Id { get; set; }
}

var xml = @"<?xml version='1.0' encoding='utf-8'?>
<Employees>
    <Employee>
        <Id> TG18-2002</Id>
        <Name> AAPM^Test^Patterns</Name>
        <Sex> O </Sex>
        <Company>
            <Id> 2.16</Id>
            <Department>
                <Id> 2.16.124</Id>
                <Project>
                    <Id> 2.16.124.113543</Id>
                </Project>
            </Department>
        </Company>
    </Employee>
    <Employee>
        <Id> TG18-2003</Id>
        <Name> AAPM^Test^Patt</Name>
        <Sex> O </Sex>
        <Company>
            <Id> 2.16</Id>
            <Department>
                <Id> 2.16.124</Id>
                <Project>
                    <Id> 2.16.124.113543</Id>
                </Project>
            </Department>
        </Company>
    </Employee>
</Employees>
";

// read the xml into the class
var doc = XDocument.Parse(xml);
var data = (from row in doc.Root.Elements("Employee")
            let company = row.Element("Company")
            let dept = company.Element("Department")
            let project = dept.Element("Project")
            select new Employee
            {
                Id = row.Element("Id").Value.Trim(),
                Name = row.Element("Name").Value.Trim(),
                Sex = row.Element("Sex").Value.Trim(),
                Company = new Company
                {
                    Id = company.Element("Id").Value.Trim(),
                    Department = new Department
                    {
                        Id = dept.Element("Id").Value.Trim(),
                        Project = new Project
                        {
                            Id = project.Element("Id").Value.Trim()
                        }
                    }
                }
            });

// now you have a collection of 'employees', bind them..

到目前为止,您需要决定如何查询数据。这个问题的答案与往常一样,取决于它,在这种情况下,我认为这主要取决于你拥有的XML数据的大小,以及是否将它带入内存是否有意义。

如果你可以将它带入内存,那么使用Linq查询Employees很好很简单,我会推荐这种方法。

如果XML很大,那么您可能需要使用XMLReader来构建您的类。稍微复杂一些,但结果仍然是您将网格绑定到类并将XML与视图分开。

答案 1 :(得分:0)

DataSet xmlData = new DataSet();
xmlData.ReadXml(YourXMLPath);
GridviewControl1.DataSource = xmlData.Tables[0];

答案 2 :(得分:0)

据我所知,您需要在数据中进行maipulication,然后再在Grid Control中显示它。

为此我建议你使用LINQ查询。你可以通过查询操纵客户端的东西。 下面我试图解决问题。

    DataSet xmlData = new DataSet();
    xmlData.ReadXml(YourXMLPath);

    DataTable dt =From x in xmlData.Tables[0].AsEnumerable().Where(x=>x.Field<string>("Name").StartWith("A")) Selct(x=>x).CopytodDataTable;

现在你可以使用&#34; dt&#34;对于您的数据网格

    xmlData.Tables[0]= dt;
    GridviewControl1.DataSource = xmlData.Tables[0];
    GridviewControl1.DataBind();//this line required if it is for asp.net

希望它会对你有所帮助。 :)