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:
Hier das XML:
So, und wenn ich nun den JavaCode ausführe:
dann bricht der immer bei "Kein Inhalt im Transformation-Tag in der XML." ab.
Weiss einer von Euch weiter?
Liebe Grüße
Marco
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