2009-10-27 7 views
0

J'ai un schéma xml et des données csv pour générer les fichiers xml correspondants.Générer un fichier XML à partir de données CSV en conformité avec un schéma xsd donné

J'ai trouvé this, comment générer des fichiers XML à partir d'un fichier CSV donné. Mais avec mon schéma, c'est toujours le même mapping à cause de l'élément. Les 5 dernières colonnes sont donc mappées en fonction de la colonne DataType.

Je pourrais développer le code avec le changement de casse, et mapper chaque élément en conséquence dans chaque cas, mais il devrait y avoir une façon plus simple de le faire. Je suis nouveau à xml, besoin d'aide ici.
P.S: J'ai essayé tous les outils, commerciaux et gratuits, qui annoncent les capacités de mappage, et je n'ai rien trouvé à faire. Excel ne fonctionne pas non plus avec un schéma dénormalisé.

Toute aide appréciée, merci
Mise à jour 1: Outils: Le code de ligne de commande C# devrait être le plus facile. Update2: L'objectif est de générer xml avec le schéma spécifié, en utilisant les données du fichier csv donné.

données 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,, 

définition du schéma:

<?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

Tout d'abord, vous devez nous donner quelques indications sur les outils dont vous disposez ou que vous souhaitez utiliser pour obtenir le résultat - ce n'est pas trop clair quelle est la question. Deuxièmement, si vous étiez un peu plus explicite sur ce que vous essayez de réaliser, CSV to XML n'est pas complexe en soi, mais CSV à un document XML complexe qui n'est pas un reflet de la structure CSV est plutôt plus difficile. – Murph

Répondre

0

Une solution rapide (si c'est un unique) serait:

  1. utilisation mysqlimport pour tirer le CSV dans un temporaire mysql table
  2. pour afficher cette table en tant que fichier XML simple
  3. Traitez le code XML généré avec une feuille de style XSL pour le mapper au schéma requis.

Si vous faites cela régulièrement, quelque chose de plus robuste/scriptable serait mieux, mais le principe est le même:

1) convertir votre CSV en XML très simple dans le même format que CSV:

processus
<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) que XML par XSL pour obtenir un document XML formaté suivant votre schéma.

Questions connexes