2009-10-27 82 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文档。