[java / xml] merge xml

Pagina: 1
Acties:

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
ik raak een beetje gefrustreerd.
Ik wil, denk ik, iets heel simpels, maar het lukt me maar niet.

Ik heb een 5tal xmlbestanden die identiek aan elkaar zijn qua structuur.
Om deze reden wil ik ze aan elkaar koppelen tot 1 groot en fijn xmlbestand.

Nu heb ik van mijn docent, ja, doe dit niet helemaal voor de lol, de optie gehad het in java te doen.
Nou heb ik wel een stukje java kunnen shrijven dat 1 bestand inleest en het in ieder geval als system.out print, maar heb werkelijk geen idee hoe ik 5 bestanden kan inlezen...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

public class Transform {

    public static void main() throws Exception {
       
        File xmlFile = new File("eerste.xml");
        
        // JAXP reads data using the Source interface
        Source xmlSource = new StreamSource(xmlFile);

        // the factory pattern supports different XSLT processors
        TransformerFactory transFact = TransformerFactory.newInstance();
        Transformer trans = transFact.newTransformer();

        trans.transform(xmlSource, new StreamResult(System.out));
    }
}


Ik kan ook 1 bestand inlezen als een DOMstream, maar ook hier telkens maar 1 source.

kan iemand mij opweg helpen?
Geen tutorial op het net helpt me en ik mag geen gebruik maken van andere zaken als de standaard DOM of SAX (JAXP?) parser van JAVA.

Klein beetje off-topic: maar een plain xslt oplossing die alle documenten samenvoegt mag ook :P

dank.

mijn naam slaat nergens op, althans niet op mij :P


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Probeer eerst voor jezelf eens een paar dingen op een rijtje te zetten:
1: Hoe wil je die bestanden eigenlijk mergen?
2: Wat doet het programmatje eigenlijk exact (probeer bij elke regel exact te beschrijven wat er gedaan wordt en wat de functie is)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
1. gewoon achter elkaar, eventueel met nieuwe root. Dat maakt met niet zoveel uit.
2. nou, dat weet ik niet precies omdat ik nou geen geweldige JAVA programmeur ben.

Globaal snap ik het (ongeveer) wel, pakt een file, leest het als stream, maakt een transformobject aan, en transformeert de source met XSLT.

Maar heb echt dus geen idee hoe ik verder moet :(

mijn naam slaat nergens op, althans niet op mij :P


  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
ik zal mijn vraag, nu ik wat ondezoek gedaan heb, concreter maken.

Kan de DOM api van JAVA meerdere XML documenten verwerken tot 1 document?

edit: hopelijk zien jullie dit niet als topickick, het is dat ik nu de DOM api iets beter snap dat uur geleden.

[ Voor 29% gewijzigd door Zoolander op 26-06-2005 14:47 ]

mijn naam slaat nergens op, althans niet op mij :P


  • KurtDB
  • Registratie: Juni 2004
  • Laatst online: 09-02 20:28
Volgens mij zoek je eerder advies over mooi object-georiënteerd programmeren? Je hebt immers al de manier gevonden waarmee je xml-files inleest. Indien je die nu eens scheidt van de plek waar je de filenames meegeeft aan je programma? En je houdt de huidige content van je grote xml-bestand bij in 'n aparte klassevariable?

(echt mooi zou zijn dat je de nodige hulpklasses zou maken, etc etc, maar dit lijkt me geen projectje dat 'n paar jaar moet gaan draaien op 'n enterprise systeem)

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
dat is nou net het probleem: ik kan geen variabele aanmaken waarin ik die DOM tree even lekker blijf uitbreiden....

Ik zie ook niet hoe ik dat kan doen met meerdere klassen.

[ Voor 23% gewijzigd door Zoolander op 26-06-2005 16:34 ]

mijn naam slaat nergens op, althans niet op mij :P


  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Oke, ik ben eruit gekomen....
Maar nu heb ik een ander probleem: hoe voeg ik een DTD toe?
Ik kan niet direct vinden hoe een DOCTYPE toegevoegd kan worden.
Iemand hier ervaring mee?

Voor degene die mijn probleem ook een keer hebben hier de code die ik voor mijn vorige probleem gebruik:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import javax.xml.parsers.*; 
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;
import java.io.*;
import org.w3c.dom.*;

public class DomEcho {

    static Document document, tempDocument;
    static int i;
    
    public static void main(String args[]) 
    {
        try {
            
            // new documentbuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // external documents
            File xmlSources = new File("source");
            File[] xmlSourcesArray = xmlSources.listFiles();
                 
            // create new document
            document = builder.newDocument();
            
            Element newRoot = document.createElement("cinedb"); 
            document.appendChild(newRoot);

            // gets first element
            Element root = document.getDocumentElement();
       
            // get external nodes
            for(i = 0; i < xmlSourcesArray.length; i++)
            {
                // parses the current document
                tempDocument = builder.parse(xmlSourcesArray[i]);
                
                Element tempChild = tempDocument.getDocumentElement();
                
                // import the current node(s) and append them
                Node importChild = document.importNode(tempChild, true);
                root.appendChild(importChild);
            }
            
            // convert to source
            DOMSource source = new DOMSource(document);
            
            // transform
            TransformerFactory transFact = TransformerFactory.newInstance();
            Transformer trans = transFact.newTransformer();
            
            trans.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, "cinedb.dtd");
            
            // set output fileproperties
            File xmlOutput = new File("cinedb.xml");
            Result result = new StreamResult(xmlOutput);
            
            trans.transform(source, result);
        }
        
        catch (Exception e) {
            System.out.println(e);
        }
    }
}


ook opgelost,

lukte eerst niet, maar dit was de truuk:

trans.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, "cinedb.dtd");

[ Voor 12% gewijzigd door Zoolander op 26-06-2005 21:41 ]

mijn naam slaat nergens op, althans niet op mij :P


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Misschien zit ik niet op te letten hoor, maar je wilt 5 xml bestanden samenvoegen tot 1 groot bestand? Eventueel met 5 roots?

Waarom open je die files niet gewoon 1 voor 1 en schrijf ze allemaal naar 1 output file? Zonder naar de xml te kijken? Als je toch de boel alleen maar over wilt pompen hoef je inhoudelijke toch niets met de xml te doen? Een file read en write is zo gepiept. Helemaal als je Jakarta Commons IO er even bijpakt.

[edit]
http://jakarta.apache.org/commons/io/apidocs/index.html

readFileToString en writeStringToFile, klaar in 3 minuten. ;)

[edit2]
Als je wat makkelijker met DOM wilt werken moet je eens naar JDOM kijken. http://www.jdom.org/

Zelfde basisprincipe, 100 x makkelijker :)

[ Voor 26% gewijzigd door zneek op 26-06-2005 23:31 ]


  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
zneek schreef op zondag 26 juni 2005 @ 23:28:
Misschien zit ik niet op te letten hoor, maar je wilt 5 xml bestanden samenvoegen tot 1 groot bestand? Eventueel met 5 roots?

Waarom open je die files niet gewoon 1 voor 1 en schrijf ze allemaal naar 1 output file? Zonder naar de xml te kijken? Als je toch de boel alleen maar over wilt pompen hoef je inhoudelijke toch niets met de xml te doen? Een file read en write is zo gepiept. Helemaal als je Jakarta Commons IO er even bijpakt.

[edit]
http://jakarta.apache.org/commons/io/apidocs/index.html

readFileToString en writeStringToFile, klaar in 3 minuten. ;)

[edit2]
Als je wat makkelijker met DOM wilt werken moet je eens naar JDOM kijken. http://www.jdom.org/

Zelfde basisprincipe, 100 x makkelijker :)
Haha, dank voor het meedenken maar,
het punt is dus dat het voor school was en ik op de standaard api's was aangewezen.
Anders had ik zeker wel xerces oid gepak :9

En ik ben het met je eens dat ik wel alles aan elkaar kan gaan plakken, maar ik wilde ook iets van DOM xml en JAVA opsteken, dus daarom op deze manier.

mijn naam slaat nergens op, althans niet op mij :P

Pagina: 1