Toon posts:

[JAVA / XML] Met java schrijven naar xml

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben op zoek naar een methode om vanuit java naar XML te schrijven.

Het volgende heb ik geprobeerd:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document docu = db.parse("c:/example.xml");

            XPath xpath = XPathFactory.newInstance().newXPath();
            XPathExpression xpathExpression = xpath.compile("/workouts/distance[@lenght='5 km snel']/week[@number='3']/day[@number='11']");
            
            Node node = (Node) xpathExpression.evaluate(docu, XPathConstants.NODE);           
            
            node.appendChild(docu.createElement("testElement"));

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DOMSource source = new DOMSource(docu);
            StreamResult result = new StreamResult(baos);
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(source, result);

            PrintWriter out = new PrintWriter(new FileOutputStream("c:/example.xml"));

            out.println(baos.toString());

            out.flush();
            out.close();


Dit genereerd een element ("testElement") in de xml file. Echter probeerde ik dit ook te doen voor attributen
Java:
1
node.appendChild(docu.createAttribute("testElement"));
maar dit werkte niet.

Eventueel wil ik ook wel een andere methode gebruiken als dat wel werkt. Ik kom er iig niet uit.

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Alles hangt ook een beetje van de usecase af waarin je het wil gaan gebruiken. In Java bestaan er bijvoorbeeld ook frameworks om een simpel java object te gaan serializeren naar een XML.

Java:
1
2
3
4
public class Person {
    private String naam;
    private Address adres;
}


zal dan worden:
XML:
1
2
3
4
5
6
7
8
<person>
    <naam>voorbeeld</naam>
    <address>
         <street>dorpsstraat</street>
         <city>stad</city>
         ...
    </address>
</person>


Zonder verder enige moeite ervoor te doen en zelf de structuur te moeten zitten aanmaken.
Voorbeelden van dergelijke frameworks zijn: Castor, XStream, JAXB

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
volgens mij bestaat er gewoon org.w3c.dom.Element.setAttribute(String name, String value).
Je moet het dus casten naar Element. Het is sowieso veel gemakkelijker om met nodes te werken.

BTW Die ByteArrayOutputstream maakt het wel onnodig ingewikkeld lijkt me.
Je kan perfect een StreamResult constructen van File.
(Er bestaat zo iets als javadocs bekijk die ook)

[ Voor 32% gewijzigd door redfox314 op 29-05-2008 16:20 ]


  • Marcj
  • Registratie: November 2000
  • Laatst online: 18-11 18:31
Of Simple XML Serialization

Maar wat het probleem van de TS is, dat hij de JavaDoc niet goed heeft gelezen. Hierin staat:
Attr createAttribute(String name) throws DOMException

Creates an Attr of the given name. Note that the Attr instance can then be set on an Element using the setAttributeNode method.
To create an attribute with a qualified name and namespace URI, use the createAttributeNS method.

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
je moet dus zelfs org.w3c.dom.Element gebruiken. Maar als je applicatie niet draait rond xml zou ik inderdaad mij daar niet mee bezig houden (Keep It Stupidly Simple) en een serialisation framework gebruiken.

Verwijderd

redfox314 schreef op vrijdag 30 mei 2008 @ 10:05:
Maar als je applicatie niet draait rond xml zou ik inderdaad mij daar niet mee bezig houden (Keep It Stupidly Simple) en een serialisation framework gebruiken.
Doe het dan echt KISS en vergeet het framework:
Java:
1
2
3
4
5
...
out.println("<element>");
out.println(escapeXml(bean.getElement()));
out.println("</element>");
...

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
Hangt af van je definitie van simpel.
Je moeten bezig houden met de details van xml lijkt me eerder complex. Zeker als je een bestaand document moet gaan bewerken.
Het gebruiken van abstracties lijkt me een van de aspecten van KISS. Als je tientallen objecten moet omzetten in XML dan is het schrijven van gespecialiseerde code voor elk object zeker geen KISS.

  • rainmaker2k
  • Registratie: Juli 2002
  • Laatst online: 26-10 14:19
Voor het gebruik van XML in Java gebruik ik meestal de DOM4J library, die een stuk makkelijker te gebruiken is dan de standaard XML mogelijkheden in Java.

Verwijderd

redfox314 schreef op vrijdag 30 mei 2008 @ 15:50:
Het gebruiken van abstracties lijkt me een van de aspecten van KISS. Als je tientallen objecten moet omzetten in XML dan is het schrijven van gespecialiseerde code voor elk object zeker geen KISS.
Onzin, de hoeveelheid objecten maakt niets uit. Wat uit maakt is hoe ze naar buiten geschreven dienen te worden; worden het elementen, attributen of en combinatie van beide. En of je dan en framework gebruikt waarbij je een definitie dient op te nemen of dat je het zelf doet, maakt dan niet veel uit. Wat wel uitmaakt is dat je dan weer in een thirdparty afhankelijkheid je project in getrokken hebt. Daarnaast maakt het zelf naar buiten schrijven of het gebruik van een framework het niet meer of minder abstract.

  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
Je hebt een punt dat je een dependency toevoegt. Dat weegt enkel niet op tegen de gevoelige actie van het schrijven van gespecialiseerde code voor elk object. De kans dat je daarin fouten maakt/niet consistent bent tussen de objecten is veel te groot. Abstraheer je dat weg door zo'n framework te gebruiken dan ga je veel minder snel fouten maken omdat je je dan alleen moet bezig houden met de essentie van de zaak.
Het probleem is natuurlijk wel dat je het ene probleem ruilt voor het andere. (het alles zelf moeten coderen en zelf de abstracties van serialisering bedenken voor het instellen en onderhouden van een framework) Het is dan om een kosten/baten analyse te doen. En daar komt het aantal objecten dat geserialiseerd dient te worden op de proppen.
Pagina: 1