【问题标题】:How to Search in XML and show results in GridView in C#?如何在 XML 中搜索并在 C# 中的 GridView 中显示结果?
【发布时间】:2014-06-20 23:07:30
【问题描述】:

我有一个员工的 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

【问题讨论】:

    标签: c# asp.net xml gridview


    【解决方案1】:

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

    这将允许您将数据(在本例中为 XML,但可以是任何东西)与您的视图(在本例中为 ASP.NET Web 窗体,但又可以是任何东西)分离,我觉得这很方便并且看起来这些天很常见(MVVM 等)。

    另一个好处是您可以将像 XML 这样的嵌套数据源转换为更扁平的东西,以使您的视图绑定更简单,例如,在您提供的示例中,您可以将 Company 字段用作外部 Employee 类的属性。

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

    说了这么多,这里有一个小 sn-p 显示您的 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 查询员工的集合是很好且简单的,我会推荐这种方法。

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

    【讨论】:

    • 应该怎么做,如果我想在&lt;Project&gt;&lt;Department&gt;中添加除ID之外的更多细节。 LINQ 语句应该是什么?
    • 对于您希望扩展类以具有这些属性的每个附加元素,然后在 Linq 表达式的相应构造函数中添加赋值,以便:NewField = dept.Element("NewField").Value。如果您无法控制 XML(来自其他地方),那么您可能希望添加空检查以确保您不会抛出 NPE。例如在 let 语句之后,添加 where company != null &amp;&amp; dept != null 等。或者先运行 XSD 验证 msdn
    【解决方案2】:
    DataSet xmlData = new DataSet();
    xmlData.ReadXml(YourXMLPath);
    GridviewControl1.DataSource = xmlData.Tables[0];
    

    【讨论】:

      【解决方案3】:

      据我了解,您需要先对数据进行修改,然后再将其显示在网格控件中。

      为此,我建议您使用 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;
      

      现在您可以在数据网格中使用“dt”

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

      希望对您有所帮助。 :)

      【讨论】:

      • error CS1002: ; expected error CS1002: ; expected error CS1525: Invalid expression term 'in' error CS1002: ; expected error CS1002: ; expected 这个程序有这么多错误。
      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 2012-04-01
      • 2014-04-14
      • 1970-01-01
      • 2019-11-05
      • 2020-07-08
      • 2016-12-11
      • 1970-01-01
      相关资源
      最近更新 更多