【问题标题】:how to get the node's Attribute in ASP.NET?如何在 ASP.NET 中获取节点的属性?
【发布时间】:2013-03-01 09:14:50
【问题描述】:

我有一个 XML 文件,我想读取它并将结果保存到数据表中,这是我的 XML 文件:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table name="tblAdminUser">
<Column>
  <displayname>
    Created Date
  </displayname>
  <orignalvalue>
    Created_Date
  </orignalvalue>
</Column>
<Column>
  <displayname>
    First Name
  </displayname>
  <orignalvalue>
    F_Name
  </orignalvalue>
</Column>
  </Table>
<Table name="test1">
   <Column> 
     <displayname>
    Last Name
  </displayname>
  <orignalvalue>
    L_Name
  </orignalvalue>
</Column>
<Column>
  <displayname>
    Created By
  </displayname>
  <orignalvalue>
    Created_By
  </orignalvalue>
</Column>
  </Table>
</NewDataSet>

现在我想做的是:

如果“table”节点的“Name”是“tblAdminuser”,那么我想获取“显示列”节点的内部值和对应的“原始值”在两列中的数据表中。

到目前为止我所做的是:

XmlDataDocument xmldoc = new XmlDataDocument();
    xmldoc.Load(Server.MapPath("~/XMLFile.xml"));
    XmlElement root = xmldoc.DocumentElement;
    XmlNodeList tablenodes = root.SelectNodes("Table");
    foreach (XmlNode nodes in tablenodes)
    {

        if (nodes.LocalName == "tblAdminUser")
        {
            XmlNodeList Columnnodes = root.SelectNodes("Column"); // You can also use XPath here
            XmlNodeList displayColumnnodes = root.SelectNodes("Column");
            foreach (XmlNode node in displayColumnnodes)
            {
                Response.Write(node.InnerText);
                // use node variable here for your beeds
            }
        }
    }

请帮助我。

【问题讨论】:

    标签: c# asp.net xml xmlreader


    【解决方案1】:

    试试这个

    XmlDataDocument xmldoc = new XmlDataDocument();
                xmldoc.Load("C:/test.xml");
                var root = xmldoc.DocumentElement;
                if (root == null) return;
                var users = new List<User>();
    
                var tablenodes = root.SelectNodes("Table");
                if (tablenodes != null)
    
                    foreach (XmlNode nodes in tablenodes)
                    {
                        if (!nodes.HasChildNodes) continue;
    
                        if (nodes.Attributes == null) continue;
                        var user = new User { UserName = nodes.Attributes[0].Value };
                        var customer = new Customer();
    
                        var nodesdisplayname = nodes.SelectNodes("Column/displayname");
    
                        if (nodesdisplayname != null)
                        {
                            var xmlNode = nodesdisplayname.Item(0);
                            if (xmlNode != null)
                            {
                                customer.DisplayName  = xmlNode.InnerText;
                            }
                        }
    
                        var nodesorignalvalue = nodes.SelectNodes("Column/orignalvalue");
    
                        if (nodesorignalvalue != null)
                        {
                            var xmlNode = nodesorignalvalue.Item(0);
                            if (xmlNode != null)
                            {
                                customer.OriginalValue = xmlNode.InnerText;
                            }
                        }
    
                        user.Customers = customer;
                        users.Add(user);
                    }
    

    在上面的代码中添加条件为

    if(nodes.Attributes[0].Value == "tblAdminUser")
    {
      // Added code here
    }
    

    并以用户和客户类为例

      public class User
        {
            public Customer Customers;
    
            public string UserName { get; set; }
        }
    
        public class Customer
        {
            public string DisplayName { get; set; }
    
            public string OriginalValue { get; set; }
        }
    

    它将返回用户列表。

    我想这会有所帮助。

    【讨论】:

    • 它不符合我的要求,但它为我提供了行材料来完全满足我的要求。所以 +1
    • 好吧,这个代码返回列表和你需要的数据表。感谢 +1
    【解决方案2】:

    似乎更好的 XPath 语句会有所帮助。

    你有

    root.SelectNodes("表");

    改成

    root.SelectNodes("//Table[(@name='tblAdminUser')]/Column")

    您可以考虑 XSLT,这里有一个示例

    <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match='/'>
    
    <table>
        <tr>
            <th>Display Name</th>
            <th>Original Value</th>
        </tr>
    
        <xsl:for-each select='//Table[(@name="tblAdminUser")]/Column'>
        <tr>
            <td><xsl:value-of select='displayname'/></td>
            <td><xsl:value-of select='orignalvalue'/></td>
        </tr>
        </xsl:for-each>
    
    </table>
    
    </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案3】:

      这是我的代码来完全满足我的要求:

      using System;
      using System.Xml;
      using System.Web;
      using System.Data;
      
      public class ClsXML
      {
      public DataTable GetColumnsFromXML(String XMLPath, String TableName)
      {
          DataTable dtForColumns = DatatableforColumns();
          XmlDataDocument xmldoc = new XmlDataDocument();
          xmldoc.Load(XMLPath);
          XmlElement root = xmldoc.DocumentElement;
          XmlNodeList tablenodes = root.SelectNodes("Table");
      
          if (tablenodes != null)
      
              foreach (XmlNode nodes in tablenodes)
              {
                  if (!nodes.HasChildNodes) continue;
                  if (nodes.Attributes == null) continue;
                  //TableName = nodes.Attributes[0].Value;
      
                  if (nodes.Attributes[0].Value == TableName)
                  {
                      String PrimaryKey = nodes.Attributes[1].Value;
                      var nodesdisplayname = nodes.SelectNodes("Column/DisplayColumn");
                      var nodesorignalvalue = nodes.SelectNodes("Column/OrignalColumn");
      
                      if (nodesdisplayname != null && nodesorignalvalue != null)
                      {
                          for (int i = 0; i <= nodesdisplayname.Count - 1; i++)
                          {
                              var xmlDisplayNode = nodesdisplayname.Item(i);
                              var xmlOrignalNode = nodesorignalvalue.Item(i);
      
      
                              if (xmlDisplayNode != null && xmlOrignalNode != null)
                              {
      
                                  DataRow dr;
                                  dr = dtForColumns.NewRow();
                                  dr["DisplayColumn"] = xmlDisplayNode.InnerText;
                                  dr["OrignalColumn"] = xmlOrignalNode.InnerText;
                                  dr["PrimaryKey"] = PrimaryKey;
                                  dtForColumns.Rows.Add(dr);
                              }
                          }
                      }
                  }
              }
          return dtForColumns;
      }
      private DataTable DatatableforColumns()
      {
          DataTable dt = new DataTable();
          dt.Columns.Add("DisplayColumn", typeof(String));
          dt.Columns.Add("OrignalColumn", typeof(String));
          dt.Columns.Add("PrimaryKey", typeof(String));
          return dt;
      }
      }
      

      感谢所有快乐的代码....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 2019-10-06
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        相关资源
        最近更新 更多