读书人

帮忙 去读以上xml格式到table表

发布时间: 2012-12-23 11:28:15 作者: rapoo

帮忙 去读以下xml格式到table表


哪位帮忙提示下或者写下将以上格式的初中成绩数据读取到初中成绩表中..


我一直读取不出来,这个方法不知道怎么改

XmlNode root = doc.SelectSingleNode(doc.DocumentElement.Name);            DataTable dt = new DataTable();            dt.TableName = "初中成绩";            //dt.Columns.Add(new DataColumn(root.ChildNodes[0].Attributes[0].Name, typeof(string)));            XmlNode node_1_1 = doc.SelectSingleNode(doc.DocumentElement.Name + "/" + doc.DocumentElement.FirstChild.Name + "/" + doc.DocumentElement.FirstChild.FirstChild.Name);            XmlNodeList nodelist_1_1 = node_1_1.ChildNodes;              for (int i = 0; i < 2; i++)            {                    dt.Columns.Add(new DataColumn(node_1_1.ChildNodes[i].Name, typeof(string)));                             }            DataRow dr = dt.NewRow();            foreach (XmlNode xn in nodelist_1_1)            {                foreach (DataColumn column in dt.Columns)                {                    if (xn.LocalName == column.ColumnName)                    {                        dr[column] = xn.InnerText.ToString().Trim();                        dt.Rows.Add(dr);                    }                }            }

[最优解释]
 DataTable dt = new DataTable("初中成绩");
DataColumn Column = new DataColumn();
Column.ColumnName = "name";
Column.DataType = System.Type.GetType("System.String");
dt.Columns.Add(Column);


DataColumn Column1 = new DataColumn();
Column1.ColumnName = "Sage";
Column1.DataType = System.Type.GetType("System.Int32");
dt.Columns.Add(Column1);
DataColumn Column2 = new DataColumn();
Column2.ColumnName = "Ssex";
Column2.DataType = System.Type.GetType("System.String");
dt.Columns.Add(Column2);
DataColumn Column3 = new DataColumn();
Column3.ColumnName = "地理";
Column3.DataType = System.Type.GetType("System.Decimal");
dt.Columns.Add(Column3);
DataColumn Column4 = new DataColumn();
Column4.ColumnName = "物理";
Column4.DataType = System.Type.GetType("System.Decimal");
dt.Columns.Add(Column4);
DataColumn Column5 = new DataColumn();
Column5.ColumnName = "化学";
Column5.DataType = System.Type.GetType("System.Decimal");
dt.Columns.Add(Column5);
XElement xml = XElement.Load(@"./Student.xml");
//MesgBox.Show(dt.Columns.Count.ToString());


for (int i = 0; i < xml.Elements().Count(); i++)
{
DataRow dr = dt.NewRow();
for (int j = 0; j < 3; j++)
{
dr[j] = xml.Elements().ElementAt(i).Attributes().ElementAt(j).Value;
}
for (int k = 0; k < 3; k++)
{
dr[k] = xml.Elements().ElementAt(i).Elements().Elements().ElementAt(k * 2 + 1).Value;
}
dt.Rows.Add(dr);
}


[其他解释]
XmlNode root = doc.SelectSingleNode("Student"),然后继续遍历root的子集
[其他解释]


public static DataTable NodeTypes()
{
DataTable Table = new DataTable();
//DataRow row = Table.NewRow();
DataRow row;
int i = 0;
DataColumn dc = null;
dc = Table.Columns.Add("ID", Type.GetType("System.Int32"));
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1


dc.AllowDBNull = true;//

dc = Table.Columns.Add("Couse", Type.GetType("System.String"));
dc = Table.Columns.Add("Score", Type.GetType("System.String"));

string xmlfile = @"~/成绩单.xml";
if (xmlfile.Length > 0)
{
XmlDocument xd = new XmlDocument();
xd.Load(xmlfile);
XmlNodeList list = xd.DocumentElement.ChildNodes;
foreach (XmlElement element in list)
{
if (element.Name.ToLower() == "file")
{
row = Table.NewRow();
row["Couse"] = Convert.ToString(element.Attributes["Couse"].InnerXml);
row["Score"] = Convert.ToString(element.Attributes["Score"].InnerXml);
Table.Rows.Add(row);
}
}
}
return Table;
}


[其他解释]
下面是用正则提取的

string str = File.ReadAllText("D:\\lx.xml", Encoding.Default);
var ary = Regex.Matches(str, @"<ttt(?=.*?Sname=""(?<name>[^""]+)"")(?=.*?Sage=""(?<age>[^""]+)"")(?=.*?Ssex=""(?<sex>[^""]+)"").*?>(((?!</ttt>)[\s\S])*?(?<score><(?<xl>\w*?)成绩>[\s\S]*?</\w.*?成绩>))*[\s\S]*?</ttt>").Cast<Match>().Select(t => new
{
name = t.Groups["name"].Value,
age = t.Groups["age"].Value,
sex = t.Groups["sex"].Value,


xueli = t.Groups["xl"].Captures.Cast<Capture>().Select(tt => tt.Value).ToArray(),
score = t.Groups["score"].Captures.Cast<Capture>().Select(x => Regex.Matches(x.Value, @"<Course>(\w+)</Course>\s*<Score>(\d+(\.\d+)?)</Score>").Cast<Match>().Select(tt => new { 科目 = tt.Groups[1].Value, 成绩 = tt.Groups[2].Value }).ToArray()).ToArray()
}).ToArray();


[其他解释]

const string CHEMISTRY = "化学";
const string PHYSICS = "物理";
const string GEOGRAPHY = "地理";
string tableName = "初中成绩";
string rootNode = "Student";
string nodeName = "ttt";
List<string> colNamesList = new List<string>();
colNamesList.Add(CHEMISTRY);
colNamesList.Add(PHYSICS);
colNamesList.Add(GEOGRAPHY);

DataTable dt = new DataTable();
dt.TableName = tableName;
dt.Columns.Add(CHEMISTRY, typeof(string));
dt.Columns.Add(PHYSICS, typeof(string));
dt.Columns.Add(GEOGRAPHY, typeof(string));
DataRow dr = null;
XDocument doc = XDocument.Load("TestData.xml");

var nodes = doc.Element(rootNode).Elements(nodeName);
foreach (var i in nodes.Elements(tableName))
{
dr = dt.NewRow();
foreach (var si in i.Elements())
{
if (colNamesList.Contains(si.Value))
{
dr[si.Value] = ((XElement)si.NextNode).Value;


}
}
dt.Rows.Add(dr);
}



LZ这个结果不知道是不是你想要的
[其他解释]
你看下XPath就什么都懂了。
http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html
[其他解释]
引用:
引用:好笑,5楼是xml代码?

那是我错了.你说的xml代码是生产xml格式数据的代码啊?这个跟我要写转换成dataset类型的方法有关系吗?只要根据xml数据来写就好了吧

他是让你把这些贴上来
<Student>
<ttt……

[其他解释]
xml结构神了,
应该改成
<Student>
<ttt Sname="李四 " Sage="15 " Ssex="女">
<初中成绩>
<Course score="77">化学</Course>
<Course score="78">地理</Course>
<Course score="88">物理</Course>
</初中成绩>
</Student>
.net xml读写用ling to xml最方便了
[其他解释]
贴上xml的完整代码,不然不好帮你写。
[其他解释]
引用:
XmlNode root = doc.SelectSingleNode("Student"),然后继续遍历root的子集
呃呃呃,我也在遍历,只能将ttt表整合出来..能否说具体点,谢谢哈
[其他解释]
root 的ChildNodes
[其他解释]
我写以下这个方法是准备吧初中成绩表数据给整合出来的,可是还是出错,我都知道怎么修改好.node.name属性又不能赋值


 WebService2.XML_WebService1 ws = new WebService2.XML_WebService1();
XmlDocument doc = new XmlDocument();
doc = ws.xd_GetM_Grade111();

XmlNode root = doc.SelectSingleNode(doc.DocumentElement.Name);
DataTable dt = new DataTable();
dt.TableName = "初中成绩";
//dt.Columns.Add(new DataColumn(root.ChildNodes[0].Attributes[0].Name, typeof(string)));
XmlNode node_1_1 = doc.SelectSingleNode(doc.DocumentElement.Name + "/" + doc.DocumentElement.FirstChild.Name + "/" + doc.DocumentElement.FirstChild.FirstChild.Name);
XmlNodeList nodelist_1_1 = node_1_1.ChildNodes;

for (int i = 0; i < 2; i++)
{
dt.Columns.Add(new DataColumn(node_1_1.ChildNodes[i].Name, typeof(string)));



}
DataRow dr = dt.NewRow();
foreach (XmlNode xn in nodelist_1_1)
{
foreach (DataColumn column in dt.Columns)
{
if (xn.LocalName == column.ColumnName)
{
dr[column] = xn.InnerText.ToString().Trim();
dt.Rows.Add(dr);
}
}
}


[其他解释]
引用:
C# code?123456789101112131415161718192021222324252627282930313233343536public static DataTable NodeTypes() { DataTable Table = new DataTable(); //DataRow row = Table.NewRow()……


能否灵活点,尽量不要涉及到里面的子节名称,觉得这样的方法后续要是数据表属性有变化的话,需要改很多
[其他解释]
怎么不可以赋值啊?你能把不能赋值的原因说出来嘛?

[其他解释]
引用:
贴上xml的完整代码,不然不好帮你写。


在5楼不是有了啊

xml格式中的数据是我调用一个方法得到的 doc = ws.xd_GetM_Grade111();
以下为我写的获取初中成绩数据的主要代码,但是结果不对

 WebService2.XML_WebService1 ws = new WebService2.XML_WebService1();
XmlDocument doc = new XmlDocument();
doc = ws.xd_GetM_Grade111();

XmlNode root = doc.SelectSingleNode(doc.DocumentElement.Name);
DataTable dt = new DataTable();
dt.TableName = "初中成绩";
XmlNode node_1_1 = doc.SelectSingleNode(doc.DocumentElement.Name + "/" + doc.DocumentElement.FirstChild.Name + "/" + doc.DocumentElement.FirstChild.FirstChild.Name);
XmlNodeList nodelist_1_1 = node_1_1.ChildNodes;



for (int i = 0; i < 2; i++)
{
dt.Columns.Add(new DataColumn(node_1_1.ChildNodes[i].Name, typeof(string)));
}
DataRow dr = dt.NewRow();
foreach (XmlNode xn in nodelist_1_1)
{
foreach (DataColumn column in dt.Columns)
{
if (xn.LocalName == column.ColumnName)
{
dr[column] = xn.InnerText.ToString().Trim();
dt.Rows.Add(dr);
}
}

}


[其他解释]
用了WebService还返回xml字符串干嘛?
[其他解释]
好笑,5楼是xml代码?
[其他解释]
引用:
用了WebService还返回xml字符串干嘛?

是这样的,用WebService做接口返回xmldocument类型的数据传到服务器,用户端再用调用接口,将数据类型转成dataset类型显示在数据控件上.有些xmldocument类型数据中还有几个嵌式表,需要一一转换成独立的表.现在就是不知道怎么抽出同级子节的数据生成一个表
[其他解释]
引用:
好笑,5楼是xml代码?


那是我错了.你说的xml代码是生产xml格式数据的代码啊?这个跟我要写转换成dataset类型的方法有关系吗?只要根据xml数据来写就好了吧
[其他解释]
引用:
引用:引用:好笑,5楼是xml代码?

那是我错了.你说的xml代码是生产xml格式数据的代码啊?这个跟我要写转换成dataset类型的方法有关系吗?只要根据xml数据来写就好了吧
他是让你把这些贴上来
<Student>
<ttt……

哦,我都占图片上去了.原来要复制

<Student>
<ttt Sname="李四 " Sage="15 " Ssex="女">
<初中成绩>
<Course>化学</Course>
<Score>77</Score>
<Course>地理</Course>
<Score>78</Score>
<Course>物理</Course>
<Score>88</Score>
</初中成绩>
</ttt>
<ttt Sname="王五" Sage="16" Ssex="男">
<初中成绩>
<Course>地理</Course>
<Score>87</Score>
<Course>物理</Course>
<Score>67</Score>
<Course>化学</Course>
<Score>89</Score>


</初中成绩>
</ttt>
<ttt Sname="张三 " Sage="14 " Ssex="男">
<初中成绩>
<Course>物理</Course>
<Score>70</Score>
<Course>化学</Course>
<Score>80</Score>
<Course>地理</Course>
<Score>90</Score>
</初中成绩>
</ttt>
</Student>


[其他解释]

改为
for (int i = 0; i < xml.Elements().Count(); i++)
{
DataRow dr = dt.NewRow();
for (int j = 0; j < 3; j++)
{
dr[j] = xml.Elements().ElementAt(i).Attributes().ElementAt(j).Value;
}
for (int k = 3; k < 6; k++)
{
dr[k] = xml.Elements().ElementAt(i).Elements().Elements().ElementAt((k - 3) * 2+1).Value;
}
dt.Rows.Add(dr);
}

[其他解释]

System.Data.DataSet ds = new System.Data.DataSet();
ds.ReadXml("Xml文件路径");
[其他解释]
引用:
C# code?12345678910111213141516171819202122232425262728293031323334353637383940 DataTable dt = new DataTable("初中成绩"); DataColumn Column = new DataColumn(); ……


要是这个表有很多列的话,那不是要写很多重复代码,有没有什么可以遍历的
DataColumn Column = new DataColumn(); Column.ColumnName = "name"; Column.DataType = System.Type.GetType("System.String"); dt.Columns.Add(Column);
[其他解释]

引用:
System.Data.DataSet ds = new System.Data.DataSet();
ds.ReadXml("Xml文件路径");



系统本身就有了,

自己便利 楼上那些 还不如用反射来的方便。
[其他解释]
table.ReadXml();
[其他解释]
撸主,如果有循环遍历的思想再加上熟练的组件的运用,问题就迎刃而解
[其他解释]
[size=13px][/size][u][u][u][u][u][u]a[/u][/u][/u][/u][/u][/u]
[其他解释]
这个应该简单吧?呵呵。
[其他解释]
引用:
下面是用正则提取的
C# code?12345678910string str = File.ReadAllText("D:\\lx.xml", Encoding.Default); var ary = Regex.Matches(str, @"<ttt(?=.*?Sname=""(?<name>[^""]+)"")(?=.*?Sage=""(?<……

用正则这位思路很好啊,只是通用性好不好
[其他解释]
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"c:\test.xml");
DataTable dt = new DataTable();
string[] columnNames = xmlDoc.SelectNodes(@"//Course").Cast<XmlNode>().Select(x => x.InnerXml).Distinct().ToArray();
foreach (string columnName in columnNames)
dt.Columns.Add(columnName, typeof(double));
XmlNodeList grades = xmlDoc.SelectNodes(@"//初中成绩");
foreach (XmlNode grade in grades)
{
DataRow row = dt.NewRow();
XmlNodeList courses = grade.SelectNodes(@"Course");
foreach (XmlNode course in courses)
{
int columnIndex = dt.Columns.IndexOf(course.InnerXml);
row[columnIndex] = course.NextSibling.InnerXml;
}
dt.Rows.Add(row);
}

[其他解释]
引用:
xml结构神了,
应该改成
<Student>
<ttt Sname="李四 " Sage="15 " Ssex="女">
<初中成绩>
<Course score="77">化学</Course>
<Course score="78">地理</Course>
<Course score="88">物理</Course>
</初中成绩>
</Student>
.net……

打错了,是linq to xml
[其他解释]
现在的结贴率低的人好多,马甲吗?


[其他解释]
DataSet有一个方法LoadXml
[其他解释]
该回复于2012-11-28 09:18:08被管理员删除

读书人网 >C#

热点推荐