我有一个XML文件,显示如下,
现在我不知道“appsetting”元素下的节点数量。 我试图用这个XML文件填充网格视图,不知何故 Gridview具有节点名称列,如标签1,标签2,标签3 ......等 并且有一行具有相应的标签值,如val 1,val 2,val 3 ..
我尝试了一些自我,但我没有得到如何在不给出节点名称的情况下获取内部值。 我试试这个,
XmlDocument doc = new XmlDocument();
doc.Load(XmlPath);
XmlNodeList xnList = doc.SelectNodes("appSettings");
foreach (XmlNode xn in xnList)
{
DataTable dt = new DataTable();
dt.Columns.Add("Tag1");
dt.Columns.Add("Tag2");
dt.Columns.Add("Tag3");
DataRow dr;
dr = dt.NewRow();
dr["Tag1"] = xn["Tag1"].InnerText;
dr["Tag2"] = xn["Tag2"].InnerText;
dr["Tag3"] = xn["Tag3"].InnerText;
dt.Rows.Add(dr);
dgv.DataSource = dt;
}
dgv.AllowUserToAddRows = false;
dgv.ReadOnly = true;
答案 0 :(得分:1)
我在@ Arin Ghazarian的帮助下得到了这个答案, 我只是修改了他的代码,
XmlDocument doc = new XmlDocument();
doc.Load(XmlPath);
DataTable dt = new DataTable();
foreach (XmlNode xn in doc.ChildNodes[0])
{
string tagName = xn.Name;
if (!dt.Columns.Contains(tagName))
{
dt.Columns.Add(tagName);
}
}
DataRow dr = dt.NewRow();
foreach (XmlNode xn in doc.ChildNodes[0])
{
dr[xn.Name] = xn.InnerText;
}
dt.Rows.Add(dr);
答案 1 :(得分:0)
使用此:
doc.Root.Elements().Where(xe => xe.Name.LocalName.StartsWith("tag", StringComparison.InvariantCultureIgnoreCase));
修改强>
如果您有不同的标记名称,但格式类似于<Tag>Value</Tag>
,则可以遍历Elements
并获取每个节点的值,如下所示:
List<List<Tuple<string, string>>> tuples = new List<List<Tuple<string, string>>>();
//if you have more than one row, some how you xml should be formatted hierarchically,
//so you need to create an outer loop here and iterate through parent nodes (rows):
List<Tuple<string, string>> tuple = new List<Tuple<string,string>>();
foreach(var node in xdoc.Root.Elements())
{
string nodeName = node.Name.LocalName;
if (!dt.Columns.Contains(nodeName))
{
dt.Columns.Add(nodeName);
}
tuple.Add(Tuple.Create(nodeName, node.Value));
}
tuples.Add(tuple);
foreach (var row in tuples)
{
DataRow dr = dt.NewRow();
foreach (var r in row)
{
dr[r.Item1] = r.Item2;
}
dt.Rows.Add(dr);
}