1

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

现在我想做的是:

如果“表”节点的“名称”是“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
            }
        }
    }

请帮我。

4

3 回答 3

2

试试这个

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; }
    }

它将返回用户列表。

我想这会有所帮助。

于 2013-03-13T13:24:56.270 回答
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>
于 2013-03-13T13:43:01.097 回答
1

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

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;
}
}

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

于 2013-03-15T10:23:55.480 回答