2016-06-15 84 views
1

我試圖弄清楚如何解組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> 

我使用這個項目春季OXM和Castor和我有過XML格式沒有控制,我通過Web服務從第三方系統拉。

更新:我不反對將Castor換成不同的編組/解編庫。

回答

1

XSLT的魔力拯救。通過運行提供的XML通過以下XSLT樣式表,我能夠創建一個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>