代码之家  ›  专栏  ›  技术社区  ›  Stimy

如何允许用户定义的XML文件格式?

  •  0
  • Stimy  · 技术社区  · 17 年前

    我希望允许用户将包含交易信息的文件上载到我的应用程序。我希望用户在这样做时能够使用自己的文件格式(XML或CSV)。

    这对于CSV文件格式来说相对容易。用户说第一个元素映射到我这边的x字段,第二个元素映射到7字段等等。

    我很欣赏你的想法。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Tomalak    17 年前

    如果输入XML可以直接映射到XML格式,那么用户需要一组XPath表达式。

    我所说的“直截了当的方式”是指一种非常基本的方式 <xsl:apply-templates>

    如果输入为:

    <root>
      <entry id="1" name"foo">
        <data1>somevalue
          <data2>othervalue</data2>
        </data1>
      </entry>
    </root>
    

    您希望的输出是:

    <records>
      <record>
        <id>1</id>
        <name>foo</name>
        <data1>somevalue</data1>
        <data2>othervalue</data2>
      </record>
    </records>
    

    • 记录元素:“条目”
    • id:“@id”
    • 名称:“@name”
    • 数据1:“数据1”
    • 数据2:“数据1/数据2”

    XSLT应该是这样的(用上述映射配置中的实际XPath表达式替换“%”中的值):

    <xsl:template match="/">
      <records>
        <xsl:apply-templates select="%root element%/%record element%" />
      </records>
    </xsl:template>
    
    <xsl:template match="%root element%/%record element%">
      <record>
        <id>
          <xsl:value-of select="%id-xpath%[1]" />
        </id>
        <name>
          <xsl:value-of select="%name-xpath%[1]" />
        </name>
        <!-- and so on -->
      </record>
    </xsl:template>
    
        2
  •  0
  •   Nic Gibson    17 年前

    如果我理解正确,您正在考虑创建所需xslt所需的UI。我假设这是一个基于web的应用程序。一种方法是使用xslt将输入xml呈现为html(我倾向于使用的是 xmlverbatim )。您可以修改此xslt以创建指向节点的链接。此外,您可以使用一些xslt为该元素生成xpath,并将其作为链接的一部分。我使用它(几年前由Jeni Tennison发布到XSL列表中)

      <xsl:for-each select="ancestor-or-self::*">
        <xsl:text />/<xsl:value-of select="name()" />
        <xsl:text />[<xsl:number />]<xsl:text />
      </xsl:for-each>
    

    完成这项工作后,您将获得xml的可视化呈现(与MSIE和Firefox提供的视图类似),但会有返回到应用程序的附加链接。然后,用户可以选择感兴趣的节点。然后,他们为您提供了所需的XPath,而无需亲自编写。

    如果您有XPath,那么生成xslt要容易得多。上面托马莱克的建议似乎是一个有效的方法。如果您实际上不需要xml作为最终输出,那么最好使用xml解析器,允许您选择给定xpath的节点。

    当然,如果您收到的信息包含任意数量的记录,这将变得更加复杂。如果是这种情况,您可以使用多阶段方法,并使用我在上面粗略介绍的技术从输入中提取记录,然后使用该方法识别记录中的各个字段。

        3
  •  0
  •   Dirk Vollmar    17 年前

    Altova MapForce

    你可能想看看他们的试用版,看看他们是如何解决这个相当复杂的问题的。