2009-04-03 12 views
2

Quelle est la meilleure façon de convertir un doc comme:Java XML analyse syntaxique

<customermodel:Customer> 
    <creditCards> 
     <cardNumber>@0</cardNumber> 
     <provider>@HSBC</provider> 
     <xsi:type>@customermodel:CreditCard</xsi:type> 
      23242552 
    </creditCards> 
    . 
    . 

Alors que les éléments avec @ deviennent des attributs pour l'élément parent.

-à-dire arriver à:

<customermodel:Customer> 
    <creditCards cardNumber="0" provider="HSBC" xsi-type="customermodel:CreditCard> 
     232323232 
    </creditCards> 
     . 
     . 

L'utilisation d'un dom? ou Sax parser ou manuellement? et je peux déplacer le @ dans <>

+0

utilisation VTD-XML, mieux que DOM, SAX ou tirer. –

Répondre

1

La meilleure façon de travailler directement avec des données XML est d'utiliser XQuery. Ce n'est pas la chose la plus facile à apprendre, mais si vous travaillez beaucoup avec XML, c'est très utile.

Certains IDE prennent même en charge l'édition XQuery (comme Oxygen XML).

http://de.wikipedia.org/wiki/XQuery http://www.oxygenxml.com/

1

Je pense que XSLT est le chemin à parcourir.

Plus de détails here

et utiliser un analyseur SAX, sauf si vous avez de très bonnes raisons.

2

Si vous décidez d'utiliser XSLT, il ressemblera à quelque chose comme

<!-- process element and attributes first so that whitespace doesn't interfere --> 
    <xsl:template match="creditCards"> 
    <xsl:copy> 
     <xsl:apply-templates select="* | @*"/> 
     <xsl:apply-templates select="text()"/> 
    </xsl:copy>  
    </xsl:template> 

    <!-- change childrent of creditCards to attributes and strip first charcter from value --> 
    <xsl:template match="creditCards/*"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="substring(., 2)"/> 
    </xsl:attribute> 
    </xsl:template> 

    <!-- rename xsi:type --> 
    <xsl:template match="creditCards/xsi:type"> 
    <xsl:attribute name="xsi-type"> 
     <xsl:value-of select="substring(., 2)"/> 
    </xsl:attribute> 
    </xsl:template> 

    <!-- identity transform --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
    </xsl:template>