我有一个XML文件,我想读取它并将结果保存到datatable中,这是我的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”节点的“名称”是“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
}
}
}
请帮帮我。
答案 0 :(得分: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; }
}
它将返回用户列表。
我想它会有所帮助。
答案 1 :(得分:2)
似乎更好的XPath声明会有所帮助。
你有
root.SelectNodes( “表”);
更改为
root.SelectNodes(“//表[(@ name ='tblAdminUser')] /列”)
您可以考虑 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>
答案 2 :(得分: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;
}
}
感谢所有快乐的代码......