【发布时间】:2021-03-10 06:20:12
【问题描述】:
我是 C# 的新手,但我对 SQL 有一定的了解
我在一个文件夹中有 1000 个 XML 文件。我需要提取某些元素并将它们存储在 SQL 中。 XMl 将包含我需要存储在 SQL 中的带有后代的段。 举个例子,下面是一个仓单123456,有多个orderline,每个orderline都有一个product/code段。
我有一个包含 5 列的 SQL 表 - Client、Warehouse、OrderReference、CustomerReference、Type 和 ProductCode。
例如
<UniversalShipment xmlns="http://www.cargowise.com/Schemas/Universal/2011/11" version="1.1">
<Shipment>
<Order>
<OrderNumber>123456</OrderNumber>
<ClientReference>abcdefg</ClientReference>
<DocketSubType>
<Code>ORD</Code>
<Description>ORDER</Description>
</DocketSubType>
<Warehouse>
<Name>Seb's Test Warehouse</Name>
</Warehouse>
<OrderLineCollection Content="Complete">
<OrderLine>
<Product>
<Code>8011</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8044</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8043</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8042</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8054</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8018</Code>
</Product>
</OrderLine>
<OrderLine>
<Product>
<Code>8061</Code>
</Product>
</OrderLine>
</OrderLineCollection>
</Order>
<OrganizationAddressCollection>
<OrganizationAddress>
<AddressType>SendersLocalClient</AddressType>
<CompanyName>The Client</CompanyName>
</OrganizationAddress>
</OrganizationAddressCollection>
</Shipment>
</UniversalShipment>
我有以下工作,但它只会将 1 行发布到 SQL - 第一个订单行,它不会循环通过订单行段
using System;
using System.Linq;
using System.Xml.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
namespace Load_XML_To_SQL
{
class Program
{
static void Main(string[] args)
{
XDocument xmlDocument = XDocument.Load(@"C:\Users\sebby\Desktop\MLL\XML to SQL\sample.xml");
XNamespace ns = xmlDocument.Root.GetDefaultNamespace();
Orders Order = new Orders();
Order.Client = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "OrganizationAddressCollection")
.Elements(ns + "OrganizationAddress")
.Elements(ns + "CompanyName")
.FirstOrDefault()?.Value;
Order.Warehouse = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "Order")
.Elements(ns + "Warehouse")
.Elements(ns + "Name")
.FirstOrDefault()?.Value;
Order.OrderReference = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "Order")
.Elements(ns + "OrderNumber")
.FirstOrDefault()?.Value;
Order.CustomerReference = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "Order")
.Elements(ns + "ClientReference")
.FirstOrDefault()?.Value;
Order.DocketSubType = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "Order")
.Elements(ns + "Type")
.Elements(ns + "Code")
.FirstOrDefault()?.Value;
Order.ProductCode = xmlDocument.Elements(ns + "UniversalShipment")
.Elements(ns + "Shipment")
.Elements(ns + "Order")
.Elements(ns + "OrderLineCollection")
.Elements(ns + "OrderLine")
.Elements(ns + "Product")
.Elements(ns + "Code")
.FirstOrDefault()?.Value;
string connetionString = null;
SqlConnection connection;
SqlCommand command;
string sql = null;
SqlDataReader dataReader;
connetionString = "Data Source=My Server;Initial Catalog=MyDB;User ID=MyUser;Password=MyPassword";
sql = "Exec InsertXML @Client='" + Order.Client +
"',@Warehouse = '" + Order.Warehouse +
"',@OrderReference='" + Order.OrderReference +
"',@CustomerReference='" + Order.CustomerReference +
"',@DocketSubtype='" + Order.DocketSubType +
"'";
connection = new SqlConnection(connetionString);
try
{
connection.Open();
command = new SqlCommand(sql, connection);
dataReader = command.ExecuteReader();
while (dataReader.Read())
{
Console.WriteLine(dataReader.GetValue(0) + " - " + dataReader.GetValue(1) + " - " + dataReader.GetValue(2));
}
dataReader.Close();
command.Dispose();
connection.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
internal class Orders
{
public string Client { get; set; }
public string Warehouse{ get; set; }
public string OrderReference { get; set; }
public string CustomerReference { get; set; }
public string DocketSubType { get; set; }
public string ProductCode { get; set; }
}
【问题讨论】: