没有唯一节点名称的解组

时间:2016-06-15 19:56:58

标签: java spring jaxb marshalling

我很难弄清楚如何解组IBM Cognos提供的XML文件。

该结构不为元素下的不同子节点提供唯一的名称,但是有一个元数据块定义了值的顺序。

这是XML文件的简化示例。

<?xml version="1.0" encoding="utf-8"?>
<dataset  xmlns="http://developer.cognos.com/schemas/xmldata/1/"  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<!--
<dataset
    xmlns="http://developer.cognos.com/schemas/xmldata/1/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://developer.cognos.com/schemas/xmldata/1/ xmldata.xsd"
>
-->
    <metadata>
          <item name="EmployeeID" type="xs:string" length="20"/>
          <item name="firstName" type="xs:string" length="50"/>
          <item name="lastName" type="xs:string" length="50"/>
    </metadata>
    <data>
        <row>
            <value>EMP1</value>
            <value>Joe</value>
            <value>Blogs</value>
        </row>
        <row>
            <value>EMP2</value>
            <value>Mary</value>
            <value>Soap</value>
        </row>
    </data>
</dataset>

我正在使用Spring OXM和Castor进行此项目,我无法控制XML格式,因为我通过第三方系统的Web服务提取它。

更新:我不会将Castor换成另外的编组/解组库。

1 个答案:

答案 0 :(得分:1)

XSLT的神奇之处在于救援。通过以下XSLT样式表运行提供的XML,我能够创建一个XML文件,然后我可以正确地解组。

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:cognos="http://developer.cognos.com/schemas/xmldata/1/">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
  <xsl:template match="/">
    <xsl:element name="DataSet">
      <xsl:for-each select="//*[name()='row']">
        <xsl:variable name="row" select="position()" />
        <xsl:element name="Row">
          <xsl:for-each select="//*[name()='item']">
            <xsl:variable name="elementName" select="@name" />
            <xsl:variable name="index" select="position()" />
            <xsl:element name="{translate($elementName,' ','_')}">
              <xsl:value-of select="//cognos:row[$row]/cognos:value[$index]" />
            </xsl:element>
          </xsl:for-each>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

这转换了XML文件如下

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DataSet>
  <Row>
    <EmployeeID>EMP1</EmployeeID>
    <firstName>Joe</firstname>
    <lastName>Blogs</lastName>
  </Row>
  <Row>
    <EmployeeID>EMP2</EmployeeID>
    <firstName>Mary</firstname>
    <lastName>Soap</lastName>
  </Row>
</DataSet>