将 Xml 转换为数据表
Posted
技术标签:
【中文标题】将 Xml 转换为数据表【英文标题】:Convert Xml to DataTable 【发布时间】:2011-09-07 20:53:34 【问题描述】:我有一个 XML 文件,我想将它插入到数据表中。 xml文件的格式如下:
<userid ID="37729">
<TestId ID="84" TimeRemaining="60" />
<QuestId ID="1">
<Answer1>
</Answer1>
<Answer2>B</Answer2>
<Answer3>
</Answer3>
<Answer4>
</Answer4>
</QuestId>
</userid>
现在我想将其插入如下数据表中:
Question Id Answer1 Answer2 Answer3 Answer4
1 A D
2 B C
3 C
谁能帮我实现这个目标。
【问题讨论】:
请正确格式化需要插入数据表的数据。这种方式很难理解。 是否有特定原因需要DataTable
?您可能可以定义一个可序列化的类并将其反序列化为一个对象,这同样容易,并且在这种形式下它可能会更有用。
@Joe Enos 是的,就像@ColinE 建议的那样,您可以使用 Linq-to-XML。
@Joe:没有任何具体的,只是想以表格格式存储XML文件..如上例。
【参考方案1】:
我将首先使用您需要的列创建一个 DataTable
,然后通过 Linq-to-XML 填充它。
您可以使用 Select 查询来创建代表每一行的对象,然后使用标准方法为每个项目创建 DataRows ...
class Quest
public string Answer1;
public string Answer2;
public string Answer3;
public string Answer4;
public static void Main()
var doc = XDocument.Load("filename.xml");
var rows = doc.Descendants("QuestId").Select(el => new Quest
Answer1 = el.Element("Answer1").Value,
Answer2 = el.Element("Answer2").Value,
Answer3 = el.Element("Answer3").Value,
Answer4 = el.Element("Answer4").Value,
);
// iterate over the rows and add to DataTable ...
【讨论】:
但是我想知道为什么我在new()
之后得到type expected
@user1590636 因为此代码无法编译。我将所需信息编辑到答案中。另一个小错误是重载XDocument.Load(yourxmlstring)
期望字符串是Uri of a file,而不是文字 XML - 将参数名称更改为“filename.xml”。当您需要直接从字符串加载时,请使用内存流。
不知道元素名称怎么办?【参考方案2】:
DataSet ds = new DataSet();
ds.ReadXml(fileNamePath);
【讨论】:
您确定提供的 XML 格式适合 ReadXml 吗?【参考方案3】:How To Read XML Data into a DataSet by Using Visual C# .NET 包含一些细节。基本上,您可以使用重载的DataSet method ReadXml 将数据放入DataSet。您的 XML 数据将在第一个 DataTable 中。
还有一个DataTable.ReadXml method。
【讨论】:
您确定提供的 XML 格式适合 ReadXml 吗? @ColinE,不,我不确定,尤其是对问题的编辑。通过运行代码很容易找到。如果这种方法有效,它将避免必须创建列和选择语句。如果数据源可以根据 ReadXml 方法进行定制,那将节省大量精力。【参考方案4】:您可以使用此代码(推荐)
MemoryStream objMS = new MemoryStream();
DataTable oDT = new DataTable();//Your DataTable which you want to convert
oDT.WriteXml(objMS);
objMS.Position = 0;
XPathDocument result = new XPathDocument(objMS);
这是另一种方式,但首先是 ex。推荐
StringWriter objSW = new StringWriter();
DataTable oDt = new DataTable();//Your DataTable which you want to convert
oDt.WriteXml(objSW);
string result = objSW.ToString();
【讨论】:
您要插入到 DataTable 的 XML 在哪里?请先阅读问题。【参考方案5】:也许这可能是一篇较旧的文章。但上述答案中的任何一个都不能帮助我。然后我为此写了一个小sn-p。
这接受具有至少 3 个级别的任何 XML(如此示例):
<XmlData>
<XmlRow>
<XmlField1>Data 1</XmlField1>
<XmlField2>Data 2</XmlField2>
<XmlField3>Data 3</XmlField3>
.......
</XmlRow>
</XmlData>
public static class XmlParser
/// <summary>
/// Converts XML string to DataTable
/// </summary>
/// <param name="Name">DataTable name</param>
/// <param name="XMLString">XML string</param>
/// <returns></returns>
public static DataTable BuildDataTableFromXml(string Name, string XMLString)
XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(XMLString));
DataTable Dt = new DataTable(Name);
try
XmlNode NodoEstructura = doc.FirstChild.FirstChild;
// Table structure (columns definition)
foreach (XmlNode columna in NodoEstructura.ChildNodes)
Dt.Columns.Add(columna.Name, typeof(String));
XmlNode Filas = doc.FirstChild;
// Data Rows
foreach (XmlNode Fila in Filas.ChildNodes)
List<string> Valores = new List<string>();
foreach (XmlNode Columna in Fila.ChildNodes)
Valores.Add(Columna.InnerText);
Dt.Rows.Add(Valores.ToArray());
catch(Exception)
return Dt;
这解决了我的问题
【讨论】:
以上是关于将 Xml 转换为数据表的主要内容,如果未能解决你的问题,请参考以下文章