Генерация XML из данных CSV в соответствии с заданной схемой XSD - PullRequest
0 голосов
/ 27 октября 2009

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

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

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

Любая помощь приветствуется, спасибо
Обновление 1: Инструменты: код командной строки C # должен быть самым простым. Обновление 2: Цель состоит в том, чтобы сгенерировать 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:minLength value="1" />
</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: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: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: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: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:sequence>
                        </xs:complexType>
                      </xs:element>
                      <xs:element name="Custom"/>
                    </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:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 Ответ

0 голосов
/ 31 октября 2009

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

  1. используйте mysqlimport, чтобы перетащить CSV во временную таблицу mysql
  2. используйте mysqldump -X для вывода этой таблицы в виде простого XML-файла
  3. обработайте выведенный 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>
    <Caption>CE_Min</Caption>
    <ColumnIndex>82</ColumnIndex>
    <MinStringLength></MinStringLength>
    <MaxStringLength></MaxStringLength>
    <D_Precision>7</D_Precision>
    <D_Scale>5</D_Scale>
  </record>
  <!-- etc... -->
</csv>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...