xml - 将非规范化数据从 excel 导出到 xml

标签 xml excel xsd denormalized

我们正在尝试将带有“非规范化数据”的 excel 表导出到 xml。表头如下:

| AssetManager Code | AssetManager Date | Portfolio Code | Portfolio Name | MarketValue | NetCashFlow | Field | Field Code | Field Name |

AssetManager Code 和 AssetManager Date 始终相同,其余列包含可变数据。

这是我们想要的 xml 输出示例:

<AssetManager Code="PFM" Date="20130117">                   
    <Portfolios>            
        <Portfolio Code="CC PSP" Name="Consilium Capital">      
            <MarketValue>5548056.51</MarketValue>   
            <NetCashFlow>0</NetCashFlow>    
            <UserFields>    
                <Field Code="AM UCGT" Name="AM daily Unrealised CG">4375</Field>
            </UserFields>   
        </Portfolio>        
        <Portfolio Code="MM (FC)" Name="Money Market UT (FC)">      
            <MarketValue>28975149.6500735</MarketValue> 
            <NetCashFlow>0</NetCashFlow>    
            <UserFields>    
                <Field Code="UCGT" Name="AM daily Unrealised CG">0</Field>
            </UserFields>   
        </Portfolio>        
    </Portfolios>           
</AssetManager> 

我们的 xsd 文件包含映射:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="AssetManager">
    <xs:complexType>
        <xs:sequence>
                    <xs:element ref="Portfolios" />
            </xs:sequence>
        <xs:attribute name="Code" type="xs:string"/>
            <xs:attribute name="Date" type="xs:string"/>
    </xs:complexType>
</xs:element>
<xs:complexType name="FieldType">
    <xs:simpleContent>
        <xs:extension base="xs:decimal">
            <xs:attribute name="Code" type="xs:string"/>
                <xs:attribute name="Name" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:element name="Portfolios">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Portfolio">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="MarketValue" type="xs:decimal"/>
        <xs:element name="NetCashFlow" type="xs:decimal"/>
        <xs:element name="UserFields">
          <xs:complexType>
            <xs:sequence>
                    <xs:element name="Field" type="FieldType"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="Code" type="xs:string"/>
      <xs:attribute name="Name" type="xs:string"/>
    </xs:complexType>
              </xs:element>
            </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

至少我们想知道为什么 excel 认为数据是非规范化的?

任何帮助将不胜感激。

最佳答案

首先,您发布的 XSD 有问题。 Portfolio 应将 maxOccurs 设置为大于 1 的值 - 否则您将不匹配示例 XML,并且在 Excel 中验证您的 map 时不会收到“非规范化数据”错误。

This article应该解释您使用 Excel map 时遇到的常见错误 - 包括您的错误。

我猜你所做的是拖放根 - 这不适用于重复元素。

您可以绕过我在下面所做的事情;它可能不适用于您的具体示例,但它应该给您一个想法。

修改您的 XSD 以说明重复粒子:

<?xml version="1.0" encoding="UTF-8"?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="AssetManager">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Portfolios"/>
            </xs:sequence>
            <xs:attribute name="Code" type="xs:string"/>
            <xs:attribute name="Date" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="FieldType">
        <xs:simpleContent>
            <xs:extension base="xs:decimal">
                <xs:attribute name="Code" type="xs:string"/>
                <xs:attribute name="Name" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:element name="Portfolios">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Portfolio" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="MarketValue" type="xs:decimal"/>
                            <xs:element name="NetCashFlow" type="xs:decimal"/>
                            <xs:element name="UserFields">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Field" type="FieldType"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="Code" type="xs:string"/>
                        <xs:attribute name="Name" type="xs:string"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

仅在第一张纸上拖动代码和日期;如果需要,将其重命名为其他名称。

enter image description here

将投资组合拖到另一个工作表。

enter image description here

填写一些数据并导出;这是我得到的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssetManager Code="a" Date="b">
    <Portfolios>
        <Portfolio Code="aa" Name="bb">
            <MarketValue>10</MarketValue>
            <NetCashFlow>100</NetCashFlow>
            <UserFields>
                <Field/>
            </UserFields>
        </Portfolio>
        <Portfolio Code="aa" Name="bb">
            <MarketValue>10</MarketValue>
            <NetCashFlow>100</NetCashFlow>
            <UserFields>
                <Field/>
            </UserFields>
        </Portfolio>
    </Portfolios>
</AssetManager>

看起来很接近。如果不是解决方案本身,它应该可以帮助您继续前进,然后进行调查。

关于xml - 将非规范化数据从 excel 导出到 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15365320/

相关文章:

android - Android Studio 1.5如何在XML中添加Button id?

java - 为什么我的 scala 程序不忽略 xml 文件的 DTD?

VBA-Excel公式计算

vba - VBA 中的 SUMIFS 公式与 "<"

xml - 使用 Notepad++ 针对 XSD 验证 XML

c# - 如何在编译期间关闭 XSD 中的包含?

xml - 如何在没有循环的情况下将简单的 XMLList 转换为字符串数组?

java - 缺少 Android 操作栏和菜单选项

java - 无法使用 Intent.ACTION_VIEW 在 Android 上打开 excel 文件

xml - 使用相对路径使用 DTD 或 XSD 进行本地 XML 验证?