Генерировать xml из данных csv в соответствии с заданной схемой xsd

У меня есть xml-схема и данные csv для создания соответствующих файлов xml.

Я нашел this, как сгенерировать xml файлы из данного CSV файла. Но с моей схемой, это всегда одно и то же отображение из-за элемента. Таким образом, последние 5 столбцов отображаются в соответствии с столбцом DataType.

Я мог бы расширить код с помощью case-переключателя и сопоставить каждый элемент соответственно в каждом случае, но должен быть более простой способ сделать это. Я новичок в xml, вам нужна помощь здесь. P.S: Я попробовал все инструменты, коммерческие и бесплатные, чтобы рекламировать возможности сопоставления и не нашел ничего для этого. Кроме того, Excel не работает с денормализованной схемой.

Любая помощь оценивается, спасибо Update1: Инструменты: код командной строки С# должен быть самым простым. Update2: Цель состоит в том, чтобы генерировать xml с указанной схемой, используя данные из данного файла csv.

Данные CSV

EntityName,FieldName,SQLType,DataType,Nullable,Caption,ColumnIndex,MinStringLength,MaxStringLength,D_Precision,D_Scale
SOChemistryRequirement,CE_Min,"decimal(7, 5)",Decimal,TRUE,CE_Min,82,,,7,5
SOChemistryRequirement,CE_Max,"decimal(7, 5)",Decimal,TRUE,CE_Max,83,,,7,5
SOTestRequirement,Weldability,bit,bool,FALSE,Weldability,107,,,,
SONumber,SONumber,varchar(6),string,FALSE,SONumber,0,,6,,

определение схемы:

<!--?xml version="1.0" encoding="utf-8"?-->
<xs:schema id="DataTypes" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- No empty string data type. -->
<xs:simpletype name="NoEmptyString">
 <xs:restriction base="xs:string">
 </xs:restriction>
</xs:simpletype>
<!-- Root element. -->
<xs:element name="ExcelFile">
<xs:complextype>
 <xs:sequence>
 <xs:element name="SheetName" type="NoEmptyString">
 <xs:element name="CellRange" type="NoEmptyString">
 <!-- Definition of columns. -->
 <xs:element name="Columns">
 <xs:complextype>
 <xs:sequence maxoccurs="unbounded">
 <!-- Information about one column. -->
 <xs:element name="Column">
 <xs:complextype>
 <xs:sequence>
 <!-- Column index in excel file. -->
 <xs:element name="ColumnIndex" type="xs:unsignedByte">
 <!-- Caption for current column in grid in importing screen. -->
 <xs:element name="Caption" type="xs:string">
 <!-- Data type of current column. -->
 <xs:element name="DataType">
 <xs:complextype>
 <!-- It can be only one from following: -->
 <xs:choice>
 <xs:element name="Boolean">
 <xs:element name="Int16">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="MinValue" type="xs:short" minoccurs="0">
 <xs:element name="MaxValue" type="xs:short" minoccurs="0">
 </xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 <xs:element name="Int32">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="MinValue" type="xs:int" minoccurs="0">
 <xs:element name="MaxValue" type="xs:int" minoccurs="0">
 </xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 <xs:element name="Int64">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="MinValue" type="xs:long" minoccurs="0">
 <xs:element name="MaxValue" type="xs:long" minoccurs="0">
 </xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 <xs:element name="Decimal">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="MinValue" type="xs:decimal" minoccurs="0">
 <xs:element name="MaxValue" type="xs:decimal" minoccurs="0">
 <xs:element name="Precision" type="xs:int" minoccurs="0">
 <xs:element name="Scale" type="xs:int" minoccurs="0">
 </xs:element></xs:element></xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 <xs:element name="DateTime">
 <xs:element name="String">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="MinLength" type="xs:int" minoccurs="0">
 <xs:element name="MaxLength" type="xs:int" minoccurs="0">
 </xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 <xs:element name="Custom">
 </xs:element></xs:element></xs:element></xs:choice>
 </xs:complextype>
 </xs:element>
 <!-- Can be NULL value? -->
 <xs:element name="IsNullable" type="xs:boolean">
 <!-- Entity name. Cannot be NULL. -->
 <xs:element name="EntityName" type="NoEmptyString">
 <!-- Field name. It can be NULL because of composite target field. -->
 <xs:element name="FieldName" type="xs:string">
 </xs:element></xs:element></xs:element></xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
 </xs:sequence>
 </xs:complextype>
 </xs:element>
 </xs:element></xs:element></xs:sequence>
 </xs:complextype>
 </xs:element>
</xs:schema>
1 ответ

Быстрое решение (если это одноразовый) было бы:

  • используйте mysqlimport, чтобы вытащить CSV во временную таблицу mysql
  • используйте mysqldump -X для вывода этой таблицы в виде простого XML файла.
  • обрабатывает выводимый XML с помощью таблицы стилей XSL для сопоставления с вашей необходимой схемой.

Если вы делаете это регулярно, то лучше будет более надежный/скриптовый, но принцип тот же:

1) конвертируйте CSV в очень простой XML в том же формате, что и CSV:

<csv>
 <record>
 <entityname>SOChemistryRequirement</entityname>
 <fieldname>CE_Min</fieldname>
 <sqltype>"decimal(7, 5)"</sqltype>
 <datatype>Decimal</datatype>
 <nullable>TRUE</nullable>
 CE_Min
 <columnindex>82</columnindex>
 
 
 <d_precision>7</d_precision>
 <d_scale>5</d_scale>
 </record>
 <!-- etc... -->
</csv>

2) обрабатывают XML через XSL, чтобы получить XML-документ, отформатированный в соответствии с вашей схемой.

licensed under cc by-sa 3.0 with attribution.