我正在尝试将xml文件放入数据集中并使用以下代码:
DataSet ds = new DataSet("TestDataSet");
ds.ReadXml(FileName);
和这个xml文件:
<Catalog>
<Rec>
<ITEM dt:dt="string"/>
<QTY dt:dt="string">1</QTY>
<SUB dt:dt="string">1</SUB>
<CATALOG dt:dt="string">ABC123</CATALOG>
</Rec>
<Rec>
<ITEM dt:dt="string"/>
<QTY dt:dt="string">1</QTY>
<SUB dt:dt="string">1</SUB>
<CATALOG dt:dt="string">ABC124</CATALOG>
</Rec>
<Rec>
<ITEM dt:dt="string"/>
<QTY dt:dt="string">1</QTY>
<SUB dt:dt="string">1</SUB>
<CATALOG dt:dt="string">ABC125</CATALOG>
</Rec>
</Catalog>
麻烦的是,在ds上设置监视之后,它似乎只包含一个名为Rec的表和一个名为Rec_Id的列。如果我删除“dt:dt =”String“”数据类型,一切正常。
我正在使用C#.net 2008 ...
有人可以告诉您导入此数据的正确方法,而无需更改xml文件吗?
由于
答案 0 :(得分:5)
只要您定义XML元素中使用的XML命名空间,就可以轻松导入它 - 没问题。
您需要让XML看起来像这样:
<Catalog xmlns:dt="some-xml-namespace-here">
<Rec>
<ITEM dt:dt="string"/>
<QTY dt:dt="string">1</QTY>
<SUB dt:dt="string">1</SUB>
<CATALOG dt:dt="string">ABC123</CATALOG>
</Rec>
.....
</Catalog>
执行此操作后,您的两行代码就像魅力一样,导入数据,没问题(进入DataSet中的5个表)。
马克
答案 1 :(得分:2)
没有太多的东西可以作为escribirénespañol。 Yo tenia el mismo problemaydespuésdeunacontinuabúsquedadasmasde probar muchas veces,encontréslfociónenlas siguientes lineas。
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("table1");
dataTable.Columns.Add("col1", typeof(string));
dataSet.Tables.Add(dataTable);
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
Parainformaciónmasdetallada pueden ver esta pagina http://msdn.microsoft.com/es-es/library/fx29c3yd(v=vs.110).aspx
Espero les ayude como ami。
Saludos
答案 2 :(得分:1)
为了让ReadXml在这种情况下正常运行,我认为你需要在XML文件中指定一个Schema。否则,读者将不知道如何处理数据类型。
答案 3 :(得分:1)
DataSet ds = new DataSet("Whatev");
DataTable catalog = ds.Tables.Add("Catalog");
DataColumn recCol = catalog.Columns.Add("Rec");
DataTable rec = ds.Tables.Add("Rec");
rec.Columns.AddRange(new DataColumn[] {
new DataColumn("ITEM", typeof(string)),
new DataColumn("QTY", typeof(string)),
new DataColumn("SUB", typeof(string)),
new DataColumn("CATALOG", typeof(string))
});
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach (XmlNode recNode in doc.GetElementsByTagName("Rec"))
{
DataRow row = rec.Rows.Add(
recNode["ITEM"].InnerText,
recNode["QTY"].InnerText,
recNode["SUB"].InnerText,
recNode["CATALOG"].InnerText);
}
你去吧。现在将有两个表,Catalog和Rec。我怀疑你只想要Rec,因为Catalog无用。因此,如果是这种情况,只需删除目录数据表代码,或者为每个目录行添加一个id属性并将其链接到rec:
DataSet ds = new DataSet("Whatev");
DataTable catalog = ds.Tables.Add("Catalog");
DataColumn idCol = catalog.Columns.Add("Id");
DataTable rec = ds.Tables.Add("Rec");
rec.Columns.AddRange(new DataColumn[] {
new DataColumn("ITEM", typeof(string)),
new DataColumn("QTY", typeof(string)),
new DataColumn("SUB", typeof(string)),
new DataColumn("CATALOG", typeof(string))
});
catalog.ChildRelations.Add("catToRecRelation", idCol, rec.Columns["CATALOG"]);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach (XmlNode recNode in doc.GetElementsByTagName("Rec"))
{
// Create id in parent Catalog node, based on CATALOG value
catalog.Rows.Add(recNode["CATALOG"].InnerText);
DataRow row = rec.Rows.Add(
recNode["ITEM"].InnerText,
recNode["QTY"].InnerText,
recNode["SUB"].InnerText,
recNode["CATALOG"].InnerText);
}
var childRows = catalog.Rows[0].GetChildRows("catToRecRelation");
答案 4 :(得分:0)
这将使其可解析。 dt命名空间通常引用xmlns:dt =“urn:schemas-microsoft-com:datatypes”。某些东西或某人搞砸了你的XML,但是如果你必须能够导入它,你可以只修改catalog元素上的xmlns属性,如下所示:
string xml = @"<Catalog xmlns=""dt"" xmlns:dt=""dt"">
<Rec>
<ITEM dt:dt=""string""/>
<QTY dt:dt=""string"">1</QTY>
<SUB dt:dt=""string"">1</SUB>
<CATALOG dt:dt=""string"">ABC123</CATALOG>
</Rec>
<Rec>
<ITEM dt:dt=""string""/>
<QTY dt:dt=""string"">1</QTY>
<SUB dt:dt=""string"">1</SUB>
<CATALOG dt:dt=""string"">ABC124</CATALOG>
</Rec>
<Rec>
<ITEM dt:dt=""string""/>
<QTY dt:dt=""string"">1</QTY>
<SUB dt:dt=""string"">1</SUB>
<CATALOG dt:dt=""string"">ABC125</CATALOG>
</Rec>
</Catalog>";
DataSet ds = new DataSet("Whatev");
TextReader txtReader = new StringReader(xml);
XmlReader reader = new XmlTextReader(txtReader);
ds.ReadXml(reader);
Debug.Assert(ds.Tables.Count ==5);
Debug.Assert((string)ds.Tables[2].Rows[0][0] == "string");
Debug.Assert((string)ds.Tables[3].Rows[0][1] == "1");
Marc也是正确的,但根据上面的定义,您可以生成匹配的架构:
<xs:schema xmlns:dt="dt" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="dt" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="Catalog"><xs:complexType> <xs:sequence><xs:element maxOccurs="unbounded" name="Rec"><xs:complexType><xs:sequence><xs:element name="ITEM"><xs:complexType><xs:attribute ref="dt:dt" use="required" /></xs:complexType></xs:element><xs:element name="QTY"><xs:complexType>
<xs:simpleContent><xs:extension base="xs:unsignedByte"><xs:attribute ref="dt:dt" use="required" /></xs:extension></xs:simpleContent></xs:complexType>
</xs:element><xs:element name="SUB"><xs:complexType><xs:simpleContent><xs:extension base="xs:unsignedByte"><xs:attribute ref="dt:dt" use="required" /></xs:extension></xs:simpleContent></xs:complexType></xs:element><xs:element name="CATALOG"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"><xs:attribute ref="dt:dt" use="required" /></xs:extension></xs:simpleContent></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:attribute name="dt" type="xs:string" /></xs:schema>
属性“dt”是引用属性。因此,如果没有xmlns =“ds”声明,xml也不能对任何模式有效。
答案 5 :(得分:0)
我使用此代码......
生成XML:
// you need to create a datatable, from a sql query, linq, your choice...
DataTable _dt = new DataTable();
// write the datatable with schema
dt.WriteXml("datatable.xml", XmlWriteMode.WriteSchema);
阅读XML:
DataTable dt = new DataTable ();
dt.Clear();
dt.ReadXml("datatable.xml", XmlReadMode.ReadSchema);
结果数据表可以用这些函数补充,这样你可以将它转换为IList
,你需要创建一个具有相同模式列的对象,这样做真的更实用:
public IList<T> toList<T>(DataTable table)
{
List<T> list = new List<T>();
T item;
Type listItemType = typeof(T);
for (int i = 0; i < table.Rows.Count; i++)
{
item = (T)Activator.CreateInstance(listItemType);
mapRow(item, table.Rows[i], listItemType);
list.Add(item);
}
return list;
}
private void mapRow(object vOb, System.Data.DataRow dr, Type type)
{
try
{
for (int col = 0; col < dr.Table.Columns.Count; col++)
{
var columnName = dr.Table.Columns[col].ColumnName;
var prop = type.GetProperty(columnName.ToUpper());
object data = dr[col];
prop.SetValue(vOb, data, null);
}
}
catch (Exception ex)
{
throw ex;
}
}
实际上,我正在开发一个使用从SQL表生成的XML的应用程序。基本上,使用上面的函数,我创建了另一个小应用程序(支持第一个),扫描XML包(每个表的XML)并创建图层业务,访问,对象和流控制,以便正确编写&amp;阅读XML。