2009-10-27 81 views
0

我有一個xml模式和csv數據來生成相應的xml文件。根據給定的xsd模式從csv數據生成xml

我找到了this,如何從給定的CSV文件生成xml文件。但是對於我的模式,由於元素的原因,它總是相同的映射。所以最後5列根據DataType列進行映射。

我可以通過大小寫切換來擴展代碼,並且在每種情況下都相應地映射每個元素,但是應該有一種更簡單的方法來完成此操作。我是xml新手,需要一些幫助。
P.S:我嘗試了所有宣傳地圖功能的商業和免費工具,但沒有發現任何可以做到的事情。此外,Excel不適用於非規範化模式。

任何幫助表示感謝,
更新1:工具:C#命令行代碼應該是最簡單的。 Update2:目標是使用給定csv文件中的數據來生成具有指定模式的xml。

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

首先,您需要向我們提供一些關於您可用或想要用來實現結果的工具的提示 - 它不太清楚問題是什麼。其次,如果您對要實現的內容更清楚一點,它會有所幫助 - CSV到XML本身並不複雜,但是,對於複雜的XML文檔而言,CSV並不反映CSV結構,而是更具挑戰性。 – Murph

回答

0

快速溶液(如果這是一個一次性的)將是:

  1. 使用mysqlimport將CSV拖入臨時文件mysql表
  2. 使用mysqldump -X將該表格輸出爲簡單的XML文件
  3. 使用XSL樣式表處理輸出的XML以映射到您所需的模式。

如果你這樣做是有規律的東西,然後更健壯/編寫腳本的效果會更好,但原理是一樣的:

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)通過XSL處理該XML以獲得格式化爲遵循模式的XML文檔。