2016-06-15 12 views
1

Ich stehe fest, wie ich eine von IBM Cognos bereitgestellte XML-Datei entpacken kann.Unmarshalling ohne eindeutigen Knotennamen

Die Struktur bietet keine eindeutigen Namen für die verschiedenen untergeordneten Knoten unter dem Element, aber es gibt einen Metadatenblock, der die Reihenfolge der Werte definiert.

Dies ist ein vereinfachtes Beispiel der XML-Datei.

<?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> 

ich mit Spring OXM und Castor für dieses Projekt und ich habe keine Kontrolle über das XML-Format, wie ich es über einen Web-Dienst von einem Fremdsystem am Zuge.

Update: Ich bin nicht ungünstig, Castor für eine andere Marshalling/Unmarshalling-Bibliothek auszuwechseln.

Antwort

1

Die Magie von XSLT zur Rettung. Indem ich das bereitgestellte XML über das folgende XSLT-Stylesheet ausführte, konnte ich eine XML-Datei erstellen, die ich dann korrekt entpacken konnte.

<?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> 

Diese XML-Datei transformiert, wie

<?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> 
folgt