【发布时间】:2016-06-25 01:04:14
【问题描述】:
您在左侧看到的是一个简单的 DataTable.WriteXML() 调用的结果。您在左侧看到的是我需要匹配的预定模式。我正在从 SQL 数据库填充数据表(请忽略我目前不包括 ItemType 元素)。如何在树中创建前几个元素,然后从数据表中写入 XML?
编辑:想到另一个问题。为什么有一个名为Document Element 的根元素,我该如何控制它的名称或消除它?
编辑:这是我迄今为止的代码尝试。
XmlWriter writer;
XmlWriterSettings xwSettings = new XmlWriterSettings();
xwSettings.Encoding = Encoding.UTF8;
xwSettings.Indent = true;
writer = XmlWriter.Create("c:\\Armanino\\Exigo\\TestItems.xml", xwSettings);
writer.WriteStartElement("GreatPlainsIntegration");
writer.WriteStartElement("TransmissionDate");
writer.WriteString(string.Format("{0:yyyy-M-d}", DateTime.Now));
writer.WriteEndElement();
writer.WriteStartElement("Batch");
writer.WriteStartElement("BatchSource");
writer.WriteString("Inv Mstr");
writer.WriteEndElement();
dtItems.WriteXml(writer);
writer.WriteEndElement();
writer.Close();
生成这个文件:
我尝试使用 writer.WriteAttributeString() 创建 GreatPlainsIntegration 元素的 xmlns:integration 部分,但是它抱怨“:”。
编辑:我实施的解决方案:包括 Batch 元素的附加子元素和第二个 Batch 元素。
XDocument xd = XDocument.Parse(GetItemHeader());
XElement gpIntegration = (XElement)xd.FirstNode;
gpIntegration.Add(new object[]
{
new XElement("TransmissionDate", DateTime.Now.ToString("yyyy-M-d")),
new XElement("TransmissionTime", DateTime.Now.ToString("HH:mm")),
new XElement("Batch", new object[]
{
new XElement("TargetCatalog", dtItemsLWI.Rows[0].Field<string>(0)),
new XElement("BatchSource", "Inv Mstr"),
new XElement("BatchNumber", GetBatchName()),
new XElement("BatchComment", GetBatchComment())
}),
new XElement("Batch", new object[]
{
new XElement("TargetCatalog", dtItemsLWE.Rows[0].Field<string>(0)),
new XElement("BatchSource", "Inv Mstr"),
new XElement("BatchNumber", GetBatchName()),
new XElement("BatchComment", GetBatchComment())
})
});
XElement batchElementLWI = gpIntegration.Descendants("Batch").FirstOrDefault();
foreach (DataRow row in dtItemsLWI.Rows)
{
batchElementLWI.Add(new XElement("Item", new XElement[]
{
new XElement(dtItemsLWI.Columns[1].ColumnName, row.Field<string>(1)),
new XElement(dtItemsLWI.Columns[2].ColumnName, row.Field<string>(2)),
new XElement(dtItemsLWI.Columns[3].ColumnName, row.Field<string>(3)),
new XElement(dtItemsLWI.Columns[4].ColumnName, row.Field<string>(4))
}));
}
DataTable dtItemSitesLWI = new DataTable();
dtItemSitesLWI.TableName = "ItemSite";
dtItemSitesLWI.Columns.Add("LegalEntityCode", typeof(string));
dtItemSitesLWI.Columns.Add("ItemNumber", typeof(string));
dtItemSitesLWI.Columns.Add("LocationCode", typeof(string));
da.GetItemSitesLWI(ref dtItemSitesLWI, sqlConn);
foreach (DataRow row in dtItemSitesLWI.Rows)
{
batchElementLWI.Add(new XElement("ItemSite", new XElement[]
{
new XElement(dtItemSitesLWI.Columns[1].ColumnName, row.Field<string>(1)),
new XElement(dtItemSitesLWI.Columns[2].ColumnName, row.Field<string>(2))
}));
}
XElement batchElementLWE = gpIntegration.Descendants("Batch").Skip(1).FirstOrDefault();
foreach (DataRow row in dtItemsLWE.Rows)
{
batchElementLWE.Add(new XElement("Item", new XElement[]
{
new XElement(dtItemsLWE.Columns[1].ColumnName, row.Field<string>(1)),
new XElement(dtItemsLWE.Columns[2].ColumnName, row.Field<string>(2)),
new XElement(dtItemsLWE.Columns[3].ColumnName, row.Field<string>(3)),
new XElement(dtItemsLWE.Columns[4].ColumnName, row.Field<string>(4))
}));
}
DataTable dtItemSitesLWE = new DataTable();
dtItemSitesLWE.TableName = "ItemSite";
dtItemSitesLWE.Columns.Add("LegalEntityCode", typeof(string));
dtItemSitesLWE.Columns.Add("ItemNumber", typeof(string));
dtItemSitesLWE.Columns.Add("LocationCode", typeof(string));
da.GetItemSitesLWE(ref dtItemSitesLWE, sqlConn);
foreach (DataRow row in dtItemSitesLWE.Rows)
{
batchElementLWE.Add(new XElement("ItemSite", new XElement[]
{
new XElement(dtItemSitesLWE.Columns[1].ColumnName, row.Field<string>(1)),
new XElement(dtItemSitesLWE.Columns[2].ColumnName, row.Field<string>(2))
}));
}
XmlWriter writer;
XmlWriterSettings xwSettings = new XmlWriterSettings();
xwSettings.Encoding = Encoding.UTF8;
xwSettings.Indent = true;
writer = XmlWriter.Create("c:\\Armanino\\Exigo\\TestItems.xml", xwSettings);
xd.WriteTo(writer);
writer.Close();
【问题讨论】:
-
你能分享一下你到目前为止所尝试的吗?您是否需要在不创建 XML 的临时内存表示的情况下直接流式传输您的输出,或者您是否可以将您的
DataTable写入XElement,然后对其进行修改并将其流式传输出来? -
我不受限制。我正在从头开始构建它。请原谅我之前没有创建过 XML。我一直在观看一些 Pluralsight 视频并尝试学习。所以理论上我知道如何创建一个元素,然后为它创建子元素。我没有建立一个心理概念是如何从数据表中创建元素,这些元素是我已经在内存中创建的另一个元素的子元素。