Castor, Xsd, Xml, Java, irgendwas läuft schief

DaRolla

Grünschnabel
Hallo,

ich habe gerade ein ganz seltsames Problem. Und zwar benutze ich Java und XML; XML mit XSD um Castor benutzen zu können.

Hier das XSD:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sendini.de" xmlns="http://www.sendini.de" elementFormDefault="qualified">

    <!-- ein "scale" besteht aus "width" und "height" -->
    <xsd:element name="xmlScale">
        <xsd:complexType>
            <xsd:attribute name="width"  type="xsd:int" use="required"/>
            <xsd:attribute name="height" type="xsd:int" use="required"/>
        </xsd:complexType>
    </xsd:element>

    <!-- ein "dither" besteht aus "colors" -->
    <xsd:element name="xmlDither">
        <xsd:complexType>
            <xsd:attribute name="colors" type="xsd:int" use="required"/>
        </xsd:complexType>
    </xsd:element>

    <!-- ein "crop" besteht aus "x", "y", "width" und "height" -->
    <xsd:element name="xmlCrop">
        <xsd:complexType>
            <xsd:attribute name="x"      type="xsd:int" use="required"/>
            <xsd:attribute name="y"      type="xsd:int" use="required"/>
            <xsd:attribute name="width"  type="xsd:int" use="required"/>
            <xsd:attribute name="height" type="xsd:int" use="required"/>
        </xsd:complexType>
    </xsd:element>

    <!-- ein "merge" besteht aus "fontid", "x", "y" und "frame" -->
    <xsd:element name="xmlMerge">
        <xsd:complexType>
            <xsd:attribute name="fontid" type="xsd:int" use="required"/>
            <xsd:attribute name="x"      type="xsd:int" use="required"/>
            <xsd:attribute name="y"      type="xsd:int" use="required"/>
            <xsd:attribute name="from"   type="xsd:int" use="required"/>
            <xsd:attribute name="to"     type="xsd:int" use="required"/>
        </xsd:complexType>
    </xsd:element>

    <!-- eine "graphic" besteht optional aus "scale", "dither" und "crop" -->
    <xsd:element name="xmlGraphic">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <!-- minOccurs=0 bedeutet: optional -->         
                <xsd:element ref="xmlScale"  minOccurs="0" maxOccurs="1"/>
                <xsd:element ref="xmlDither" minOccurs="0" maxOccurs="1"/>
                <xsd:element ref="xmlCrop"   minOccurs="0" maxOccurs="1"/>
                <xsd:element ref="xmlMerge"  minOccurs="0" maxOccurs="1"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>

    <!-- ein "transform" besteht aus einem oder mehreren "graphic" (spaeter auch "sound" und "video") -->
    <xsd:element name="xmlTransform">
        <xsd:complexType>
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element ref="xmlGraphic" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    
</xsd:schema>

Hier das XML:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xmlTransform xmlns="http://www.sendini.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sendini.de transform.xsd">
  <xmlGraphic>
    <xmlCrop height="1" width="1" x="1" y="1"></xmlCrop>
  </xmlGraphic>
</xmlTransform>

So, und wenn ich nun den JavaCode ausführe:
Code:
    /**
     * Laedt die Grafik aus einer URI und benutzt die XML Datei um die 4 
     * Transformationen Scale, Dither, Crop und Merge zu deligieren.
     * @param planarImage <code>PlanarImage</code> die Grafik wie sie in JAI gebraucht wird
     * @param xml <code>String</code> XML Datei (benutzt Schema transformation.xsd)
     * @return <code>PlanarImage</code> - die Grafik wie sie in JAI gebraucht wird 
     * @throws RenderingException bei einem Fehler mit den Parametern oder beim XML Parsing
     */
    public static PlanarImage transformGfx( PlanarImage planarImage, String xml ) throws RenderingException {
        
        // Variablen
        XmlTransform        xmlTransform     = null;
        XmlTransformItem    xmlTransformItem = null;
        XmlGraphic          xmlGraphic       = null;
        XmlGraphicItem      xmlGraphicItem   = null;
        XmlScale            xmlScale         = null;
        XmlDither           xmlDither        = null;
        XmlCrop             xmlCrop          = null;
        XmlMerge            xmlMerge         = null;
        
        
        if( xml == null ) {
            logger.debug( "Kann nicht per XML transformieren da NULL." );
            return( planarImage );
        }
        
        if( xml.compareTo( "" ) == 0 ) {
            logger.debug( "Kann nicht per XML transformieren da Leerstring." );
            return( planarImage );
        }       
        
        // XML (ist schon UTF-8 weil DB)
        try {
            xmlTransform = XmlTransform.unmarshal( new StringReader( xml ) );

            // <transformation></transformation>
            if( xmlTransform.getXmlTransformItemCount() == 0 ) {
                logger.warn( "Kein Inhalt im Transformation-Tag in der XML." );
                return( planarImage );
            }
            
            // nur 1 Transformation
            xmlTransformItem = xmlTransform.getXmlTransformItem( 0 );   
                        
            // nur 1 Graphic
            xmlGraphic = xmlTransformItem.getXmlGraphic( 0 );               
            
            // ueber alle Scale, Depth und Crop iterieren, pro Item nur eins
            for( int g=0; g<xmlGraphic.getXmlGraphicItemCount(); g++ ) {
                
                xmlGraphicItem = xmlGraphic.getXmlGraphicItem( g );

                // Groesse veraendern
                xmlScale = xmlGraphicItem.getXmlScale();
                if( xmlScale != null ) {                    
                    planarImage = scaleGfxBicubic( planarImage, xmlScale.getWidth(), xmlScale.getHeight() );
                }

                // Farbtiefe veraendern
                xmlDither = xmlGraphicItem.getXmlDither();
                if( xmlDither != null ) {   
                    planarImage = ditherGfx( planarImage, xmlDither.getColors() );
                }

                // Teil des Bildes ausschneiden
                xmlCrop = xmlGraphicItem.getXmlCrop();
                if( xmlCrop != null ) {
                    planarImage = cropGfx( planarImage, xmlCrop.getX(), xmlCrop.getY(), xmlCrop.getWidth(), xmlCrop.getHeight() );
                }
                
                // zwei Bilder mischen
                xmlMerge = xmlGraphicItem.getXmlMerge();
                if( xmlMerge != null ) {
                    logger.debug( "Die Transformation xmlMerge wird nicht unterstuetzt." );
                }
            }
        }
        catch( MarshalException e ) {
            throw new RenderingException( e );
        }
        catch( ValidationException e ) {
            throw new RenderingException( e );          
        }
        
        return( planarImage );
    }//transformGfx

dann bricht der immer bei "Kein Inhalt im Transformation-Tag in der XML." ab.

Weiss einer von Euch weiter?

Liebe Grüße
Marco
 
Zurück