JDOM und XML

  • Themenstarter Themenstarter Tobias Köhler
  • Beginndatum Beginndatum
T

Tobias Köhler

Hallo

2 Fragen habe ich und zwar folgende:)

Mein erstes Problem ist folgendes
Ich erstelle mit JDOM eine XML-Datei. Diese soll einen Banner haben. Wie kann ich mit JDOM bilder in XML laden?

Das aber größere Problem ist:
Diese XML Datei soll dann per JDOM transformiert werden. Die passende XSL-Datei liegt bereits vor. Nur soll das Ausgabeformat Word sein, bzw. eine XML-Datei, die automatisch mit Word geöffnet wird.

Ok, da gibt es auch einen Befehl für, aber bisher war es mir nur möglich, den manuell (also nach erstellen der XML-Datei, nachträglich im Editor) einzugeben.

Code:

<?mso-application progid="Word.Document"?>

Gibt es dafür eine Möglichkeit, per JDOM dies in die XML-Datei einzubinden?

Hoffe, ihr könnt mir helfen
 
Das Schlüsselwort sind hier Processing Instructions. Die findest Du dann auch in der JDOM API Dokumentation. So in der Art müßte es gehen:
Java:
content.add(new ProcessingInstruction("mso-application",
            	"progid=\"Word.Document\""));

Gruß
 
Danke, das hat schon mal geklappt:) aber nun steh ich vor folgendem Problem

vorweg schonmal, Eclipse wirft keine Fehler-.-
Ich habe jetzt also ein XMLfile und ein XSLfile und möchte das XML-file damit jetzt bearbeiten, sodass, wenn man das XML file dann mit Word öffnet, es auch im word-typischen format dargestellt wird. Klappt aber nicht. Aus irgendeinem Grund möchte er das einfach nicht machen. Ich poste einfach mal alles wichtige, vll entdeckt ihr den Fehler?

Die XML-Datei
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Word.Document"?>
<rechnung>
	<briefkopf>
		<logo>banner.gif</logo>
		<datum>22.08.2007</datum>
		<text>Rechnung/Bestellzusammenfassung für aaa aaa</text>
	</briefkopf>
	
	<zentrum>
		<warenkorb>
			<zeile>
				<anzahl>5</anzahl>
				<bezeichnung>name</bezeichnung>
				<beschreibung>Artikel 3</beschreibung>
				<preis>50.0</preis>
			</zeile>
			<zeile>
				<anzahl>5</anzahl>
				<bezeichnung>testname</bezeichnung>
				<beschreibung>Neuer Artikel</beschreibung>
				<preis>100.0</preis>
			</zeile>
			<zeile>
				<anzahl>5</anzahl>
				<bezeichnung>test</bezeichnung>
				<beschreibung>Testartikel</beschreibung>
				<preis>150.0</preis>
			</zeile>
			<zusammenfassung>
				<anzahl_gesamt>15</anzahl_gesamt>
				<preis_gesamt>300.0</preis_gesamt>
			</zusammenfassung>
		</warenkorb>
	</zentrum>
</rechnung>

Die XSL-Datei
Code:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<xsl:output method="xml" indent="yes" />
	<xsl:template match="/">
		<xsl:processing-instruction name="mso-application">
			<xsl:text>progid="Word.Document"</xsl:text>
		</xsl:processing-instruction>
		<w:wordDocument>
			<w:body>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<xsl:apply-templates select="rechnung/briefkopf" />
					</w:r>
				</w:p>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<xsl:apply-templates select="rechnung/zentrum" />
					</w:r>
				</w:p>
	
				<w:tbl>
					<w:tblPr>
						<w:tblStyle w:val="TableGrid"/>
						<w:tblW w:w="0" w:type="auto"/>
						<w:tblLook w:val="01E0"/>						
						<w:jc w:val="center"/>	
					</w:tblPr>
					<w:tblGrid>
						<w:gridCol w:w="4428"/>
						<w:gridCol w:w="4428"/>
					</w:tblGrid>
					<w:tr>
						<w:tc>
							<w:p>
								<w:r>
									<w:rPr>
										<w:b/>
									</w:rPr>
									<w:t> Anzahl </w:t>
								</w:r>
							</w:p>
						</w:tc>
						<w:tc>
							<w:p>
								<w:r>
									<w:rPr>
										<w:b/>
									</w:rPr>
									<w:t> Bezeichnung </w:t>
								</w:r>
							</w:p>
						</w:tc>
						<w:tc>
							<w:p>
								<w:r>
									<w:rPr>
										<w:b/>
									</w:rPr>
									<w:t> Beschreibung </w:t>
								</w:r>
							</w:p>
						</w:tc>
						<w:tc>
							<w:p>
								<w:r>
									<w:rPr>
										<w:b/>
									</w:rPr>
									<w:t> Preis </w:t>
								</w:r>
							</w:p>
						</w:tc>
					</w:tr>
					<xsl:apply-templates select="rechnung/zentrum/warenkorb/zeile" />
					<xsl:apply-templates select="rechnung/zentrum/warenkorb/zusammenfassung" />
				</w:tbl>
			</w:body>
		</w:wordDocument>
	</xsl:template>
	
	<xsl:template match="briefkopf">
	
			<w:p>
				<w:pPr>
					<w:jc w:val="center"/>			
				</w:pPr>				
				<w:r>
					<w:rPr>
						<w:b/>
						<w:sz w:val="40"/>		
						<w:sz-cs w:val="40"/>
					</w:rPr>
					<w:t><xsl:value-of select="logo" /></w:t>
				</w:r>
			</w:p>
		<w:p>
			<w:pPr>
				<w:jc w:val="right"/>					
			</w:pPr>
			<w:r>
				<w:rPr>
					<w:sz w:val="28"/>
					<w:sz-cs w:val="28"/>
				</w:rPr>
				<w:t>
					<xsl:value-of select="datum" />
				</w:t>
			</w:r>
		</w:p>
		<w:p>	
			<w:r>
				<w:t>
				</w:t>
			</w:r>
		</w:p>
		<w:p>
			<w:pPr>
				<w:jc w:val="center"/>			
			</w:pPr>	
			<w:r>
				<w:rPr>
					<w:sz w:val="28"/>
					<w:sz-cs w:val="28"/>
				</w:rPr>
				<w:t>
					<xsl:value-of select="text" />
				</w:t>
			</w:r>
		</w:p>
	</xsl:template>
	
	<xsl:template match="zentrum">
		<w:p/>
		<w:p/>
		<w:p/>
		<w:p/>
		<w:p/>
	</xsl:template>
	

	<xsl:template match="zeile">
		<w:tr>
			<w:tc>
				<w:p>
					<w:r>
						<w:t>
							<xsl:value-of select="anzahl" />
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:t>
							<xsl:value-of select="bezeichnung"/>
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:t>
							<xsl:value-of select="beschreibung"/>
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:t>
							<xsl:value-of select="preis"/>
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
		</w:tr>
	</xsl:template>
 
	<xsl:template match="zusammenfassung">
		<w:tr>
			<w:tc>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<w:t>
							<xsl:value-of select="anzahl_gesamt" />	   
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<w:t>Artikel</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<w:t>Gesamt-Preis:</w:t>
					</w:r>
				</w:p>
			</w:tc>
			<w:tc>
				<w:p>
					<w:r>
						<w:rPr>
							<w:b/>
						</w:rPr>
						<w:t>
							<xsl:value-of select="preis_gesamt"/>
						</w:t>
					</w:r>
				</w:p>
			</w:tc>
		</w:tr>
	</xsl:template>
</xsl:stylesheet>

Die Methode in Java
Code:
public void xmlToWord()
		{
			String xmlFile;
			String xslFile;
			Document docXml = null;

			try
				{
					xmlFile = "warenkorb.xml";
					xslFile = "warenkorb.xsl";
				}
			catch(Exception e)
				{
					xmlFile = "warenkorb.xml";
					xslFile = "warenkorb.xsl";
					System.out.println("Error1: " + e.toString() );
				} 
			
			 SAXBuilder builder = new SAXBuilder();
			 // XML-Datei einlesen
			 try 
			 	{
				 	docXml = builder.build(xmlFile);
			 	} 
			 catch (JDOMException e) 
			 	{
				 	// TODO Auto-generated catch block
				 	System.out.println("Error2: " + e.toString() );
			 	} 
			 catch (IOException e) 
			 	{
				// TODO Auto-generated catch block
				 System.out.println("Error3: " + e.toString() );
			 	}
			 Document docResults = null;
			 
			 try{
			      StreamSource strmSrc = new StreamSource(xslFile);
			      TransformerFactory tFact = TransformerFactory.newInstance();
			      Transformer transformer = tFact.newTransformer(strmSrc);
			      JDOMResult jdRes = new JDOMResult();
			      JDOMSource jdSrc = new JDOMSource(docXml);
			      transformer.transform(jdSrc, jdRes );
			      docResults = jdRes.getDocument();
					
					XMLOutputter outputter = new XMLOutputter();
					FileOutputStream output = null;
					try 
						{
							output = new FileOutputStream("warenkorb.xml");
							outputter.output(docResults,output);
						} 
					catch (IOException e1) 
						{
						// TODO Auto-generated catch block
						System.out.println("Error4: " + e1.toString() );
						}
			    }
			 catch(Exception e)
			 	{
			      System.out.println("Error5: " + e.toString() );
			    }
		}
 
Was für einen Fehler bringt er denn? ich hab das eben mal nachgestellt:
Java:
public class WordML {

	public void xmlToWord(String xmlFile, String xslFile)
	{

		try{
			Document docXml = null;

			SAXBuilder builder = new SAXBuilder();
			// XML-Datei einlesen
			Document docResults = null;

			docXml = builder.build(xmlFile);
			StreamSource strmSrc = new StreamSource(xslFile);
			TransformerFactory tFact = TransformerFactory.newInstance();
			Transformer transformer = tFact.newTransformer(strmSrc);
			JDOMResult jdRes = new JDOMResult();
			JDOMSource jdSrc = new JDOMSource(docXml);
			transformer.transform(jdSrc, jdRes );
			docResults = jdRes.getDocument();

			XMLOutputter outputter = new XMLOutputter();
			FileOutputStream output = null;
			output = new FileOutputStream("out-"+xmlFile);
			outputter.output(docResults,output);
		}
		catch(Exception e)
		{
			System.out.println("Error5: " + e.toString() );
		}
	}

	public static void main(String[] args) {
		
		WordML wml = new WordML();
		wml.xmlToWord(args[0], args[1]);

	}

}
Mit den beiden Dateien von Dir kommt bei mir ein gültiges XML raus, das Word bereits als Tabelle darstellt. Siehe Anhang.

Gruß
 

Anhänge

Ist mir fast schon zu peinlich^^
Anfängerfehler:-(
hab mehrere Klassen und ne SWT Oberfläche. Und bei dem Listener des Buttons wurde zwar die Methode XML_erstellen aufgerufen aber nicht xmlToWord. Nun gehts
 
Zurück