我有两个字符串。一个字符串具有XML数据,另一个字符串具有相应的XML模式。我正在尝试读取DataTable中的数据。看起来这是不可能的。我不想使用数据集。有没有办法可以将XML数据和Schema组合成一个内存流并读取?
答案 0 :(得分:4)
简单地说,不,没有办法通过DataTable上的方法将xml直接加载到DataTable中,也没有办法直接从任意模式创建DataTable。这些操作必须通过DataSet完成;否则,你最终会做一些非常复杂的解决方法。
使用xml序列化可以应用一些技术,可以从以前序列化的xml重新创建数据集。但这不允许使用任意模式。
您还可以编写专门用于加载XML的代码(通过XDocument,XmlDocument或XmlTextReader)并动态创建DataTable,但写入并不是一件容易的事情,可能会花费你很长时间。它也有点重新发明轮子。
实质上,DataSet是该层次结构中唯一具有处理XML的方法的类,因为Xml可以包含任意数量的表。为了处理最广泛的情况,当您几乎不能对XML做出任何假设时,必须在该级别实现。
您还可以考虑将xml简单地加载到XDocument中,使用Validate扩展方法验证它,并使用Linq to Xml进行查询是否合适。
答案 1 :(得分:3)
有没有办法可以将XML数据和Schema组合到一个内存中 流和阅读?
方式强>
static DataTable ParseXML(string xmlString)
{
DataSet ds = new DataSet();
byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlString);
Stream memory = new MemoryStream(xmlBytes);
ds.ReadXml(memory);
return ds.Tables[0];
}
示例:强>
string xml = new XElement("inventory",
new XElement("item",
new XElement("name", "rock"),
new XElement("price", "5000")),
new XElement("item",
new XElement("name", "new car"),
new XElement("price", "1"))).ToString();
DataTable dt = ParseXML(xml);
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
Console.Write(row[col.ColumnName] + " | ");
Console.WriteLine();
}