Я хочу разработать пользовательский компонент SSIS, который берет путь документа XML с локального компьютера, а затем читает этот документ XML в соответствии с тем, что если есть корневой узел, то циклически перебираю документ и выбираю корневой узел, а также перебираю другой родительский элемент исоответствующие дочерние элементы.С помощью XML-файла я хочу, чтобы он автоматически генерировал столбец таблицы и поля, которые я хочу затем передать в OLE DB Destination.
Я пробую это с примером XML-документа, но я не знаю правильный путьпрочитать файл XML и в соответствии с этим сделать столбец и типы данных для OLE DB Destination
Вот мой код для этого конкретного компонента, это метод, который
public DataTable GetRSSDataTable(String xmlpath)
{
DataTable dt = new DataTable();
try
{
XmlReader reader = XmlReader.Create(xmlpath);
XmlDocument document = new XmlDocument();
document.Load(reader);
dt.Columns.Add("Title", Type.GetType("System.String"));
//dt.Columns.Add("pubDate", Type.GetType("System.DateTime"));
dt.Columns.Add("URL", Type.GetType("System.String"));
foreach (XmlNode node in document.DocumentElement)
{
DataRow dRow = dt.NewRow();
dRow["Title"] = node.InnerText;
//dRow["PublishDate"] = node.Attributes[1].ToString();
dRow["URL"] = node.InnerText;
dt.Rows.Add(dRow);
}
return dt;
}
catch (Exception e)
{
throw e;
}
}
public void AddOutputColumns(String propertyValue)
{
DataTable dt = GetRSSDataTable(propertyValue);
if (dt != null)
{
//Check if there are any rows in the datatable
if (dt.Rows != null && dt.Rows.Count > 0)
{
DataTable schemaDT = dt.CreateDataReader().GetSchemaTable();
foreach (DataRow row in schemaDT.Rows)
{
IDTSOutputColumn100 outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();
bool isLong = false;
DataType dType = DataRecordTypeToBufferType((Type)row["DataType"]);
dType = ConvertBufferDataTypeToFitManaged(dType, ref isLong);
int length = ((int)row["ColumnSize"]) == -1 ? 1000 : (int)row["ColumnSize"];
int precision = row["NumericPrecision"] is System.DBNull ? 0 : (short)row["NumericPrecision"];
int scale = row["NumericScale"] is System.DBNull ? 0 : (short)row["NumericScale"];
int codePage = schemaDT.Locale.TextInfo.ANSICodePage;
switch (dType)
{
case DataType.DT_STR:
case DataType.DT_TEXT:
precision = 0;
scale = 0;
break;
case DataType.DT_NUMERIC:
length = 0;
codePage = 0;
if (precision > 38)
precision = 38;
if (scale > precision)
scale = precision;
break;
case DataType.DT_DECIMAL:
length = 0;
precision = 0;
codePage = 0;
if (scale > 28)
scale = 28;
break;
case DataType.DT_WSTR:
precision = 0;
scale = 0;
codePage = 0;
break;
default:
length = 0;
precision = 0;
scale = 0;
codePage = 0;
break;
}
outputCol.Name = row["ColumnName"].ToString();
outputCol.SetDataTypeProperties(dType, length, precision, scale, codePage);
}
}
}
}
Остальной код тот же самыйкоторый мы используем, чтобы сделать любой пользовательский компонент
На самом деле я хочу знать, какой из них является лучшим способом для чтения данных в XML-файле на локальном компьютере и, во-вторых, в соответствии с этой информацией, как создавать выходные столбцы и данные в этих столбцахкоторый требуется передать в пункт назначения OLE DB.Пожалуйста, помогите мне.