Avatar billede luctatic Nybegynder
21. maj 2003 - 16:59 Der er 16 kommentarer og
1 løsning

Skrivning til en XML fil

Når man nu har en hyggelig lille xml-fil på et par sider er det jo meningsløst hvis man for at udskifte attributten på et enkelt element, skal søge hele filen igennem selv - det må der da være en måde at gøre nemmere.

Det er jo ikke nogen sag at finde frem til attributten ved at søge dokumentet igennem - men hvordan skriver man så den ændrede attribut til filen? Har forgæves prøvet at lede efter en XML-writer, men uden det største held ind til videre, selv ikke i JAXP. Nogen der har bedre forslag?
Avatar billede arne_v Ekspert
21. maj 2003 - 17:05 #1
1)  Du er nødt til at genskrive hele filen. Man kan ikek rette midt i
    en tekst-fil.

2)  Der er flere måder at skrive på:

    a)  du udskriver løbende mens du søger efter det pågældende
        med enten W3C DOM eller SAX

    b)  du retter i W3C DOM træ og udskriver det
Avatar billede arne_v Ekspert
21. maj 2003 - 17:07 #2
Det er noget nemmere hvis du bruger JDOm i.s.f. W3C DOM.

Eksempel:

  <?xml version="1.0" encoding="UTF-8" ?>
  <allf>
  <f>1</f>
  <f>2</f>
  <f>3</f>
  </allf>


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.adapters.DOMAdapter;
import org.jdom.adapters.XercesDOMAdapter;
import org.jdom.input.DOMBuilder;
import org.jdom.output.XMLOutputter;

public class AddElement {
    public static void main(String[] args) {
        try {
            DOMAdapter adapt = new XercesDOMAdapter();
            org.w3c.dom.Document w3cdoc = adapt.getDocument(new FileInputStream("test.xml"), false);
            DOMBuilder build = new DOMBuilder();
            Document doc = build.build(w3cdoc);
            Element newelm = new Element("f");
            newelm.setText("4");
            doc.getRootElement().addContent(newelm);
            XMLOutputter xmlout = new XMLOutputter();
            xmlout.output(doc, System.out);
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
Avatar billede luctatic Nybegynder
21. maj 2003 - 17:30 #3
Trist eftersom jeg har brugt DOM hele vejen igennem til at få værdierne UD af xml dokumentet. Nu skal jeg så til at ændre alt dette.
Avatar billede arne_v Ekspert
21. maj 2003 - 17:40 #4
Hvorfor skriver du ikke en lille utility der kan outputte et W3C DOM
træ ?

Jeg kan også prøve at lave noget !
Avatar billede luctatic Nybegynder
21. maj 2003 - 17:46 #5
Jo jo, men så skal man jo som du selv nævnte lave en utility der tester hele træet efter og udskriver det hver gang. Har overvejet det, men kigger lidt på JDOM først. Ser umiddelbart ud til at konverteringen ikke bliver HELT syg da mange af metoderne heldigvis ser nogenlunde ens ud.

Men at lave sin egen output'er er jo klart en metode eftersom man jo hurtigt i WC3.DOM kan søge det igennem, skrive tag's for det hele og bruge det som udgangspunkt. Vil dog nok lige tage et par timer at få det nørklet på plads.
Avatar billede arne_v Ekspert
21. maj 2003 - 19:11 #6
Hvis du bruger Xerces (hvad er ret almindeligt), så behøver du ikke
engang skrive det selv:

import org.apache.xml.serialize.XMLSerializer;

...

        XMLSerializer ser = new XMLSerializer(System.out, null);
        ser.serialize(doc.getDocumentElement());
Avatar billede arne_v Ekspert
21. maj 2003 - 19:18 #7
Jeg mente jo nok at jeg havde set den et eller andet sted.

Men det var først da jeg kom hjem og kunne slå den op i
min XML bog at jeg kunne finde den.
Avatar billede luctatic Nybegynder
21. maj 2003 - 20:49 #8
Hvilken objekt-type er 'doc' når man bruger XMLSerializer? Hvis jeg kan bruge det Document objekt jeg allerede har i DOM parseren, i ser.serialize(doc.getDocumentElement()) ville det jo være klart nemmest.
Avatar billede arne_v Ekspert
21. maj 2003 - 20:52 #9
doc er en ægte org.w3c.dom.Document (altså standard W3C DOM document).

Det er kun selve XMLSerializer der er Xerces specifik.
Avatar billede luctatic Nybegynder
21. maj 2003 - 21:00 #10
Må jeg prøve efter imorgen. Med mindre mine kolleger har ændret hele koden til JDOM her i aften efter jeg gik hjem. :D
Avatar billede arne_v Ekspert
21. maj 2003 - 21:27 #11
Og det er som sagt Xerces specifik. Hvis man bruger Crimson har man
slet ikke den klasse.
Avatar billede medions Nybegynder
22. maj 2003 - 09:27 #12
Hej Arne.
Jeg har lige fulgt med i dette indlæg, og har prøvet at lave et eksempel med din kode... Men jeg får flg. fejlmeddelser:

C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:5: package org.jdom does not exist
import org.jdom.Document;
                ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:6: package org.jdom does not exist
import org.jdom.Element;
                ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:7: package org.jdom.adapters does not exist
import org.jdom.adapters.DOMAdapter;
                        ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:8: package org.jdom.adapters does not exist
import org.jdom.adapters.XercesDOMAdapter;
                        ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:9: package org.jdom.input does not exist
import org.jdom.input.DOMBuilder;
                      ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:10: package org.jdom.output does not exist
import org.jdom.output.XMLOutputter;
                      ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:15: cannot resolve symbol
symbol  : class DOMAdapter
location: class FirstXML
            DOMAdapter adapt = new XercesDOMAdapter();
            ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:15: cannot resolve symbol
symbol  : class XercesDOMAdapter
location: class FirstXML
            DOMAdapter adapt = new XercesDOMAdapter();
                                  ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:17: cannot resolve symbol
symbol  : class DOMBuilder
location: class FirstXML
            DOMBuilder build = new DOMBuilder();
            ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:17: cannot resolve symbol
symbol  : class DOMBuilder
location: class FirstXML
            DOMBuilder build = new DOMBuilder();
                                  ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:18: cannot resolve symbol
symbol  : class Document
location: class FirstXML
            Document doc = build.build(w3cdoc);
            ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:19: cannot resolve symbol
symbol  : class Element
location: class FirstXML
            Element newelm = new Element("f");
            ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:19: cannot resolve symbol
symbol  : class Element
location: class FirstXML
            Element newelm = new Element("f");
                                ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:22: cannot resolve symbol
symbol  : class XMLOutputter
location: class FirstXML
            XMLOutputter xmlout = new XMLOutputter();
            ^
C:\Programmer\Xinox Software\JCreator Pro\MyProjects\FirstXMLPro\FirstXML.java:22: cannot resolve symbol
symbol  : class XMLOutputter
location: class FirstXML
            XMLOutputter xmlout = new XMLOutputter();
                                      ^
15 errors

Process completed.

Hvordan kan det være?

//>Rune
Avatar billede arne_v Ekspert
22. maj 2003 - 09:31 #13
Gæt - du har ikke downloadet JDOM og puttet det i classpath.

JDOM er ikke en standard del af Java men skal hentes separat.

Jeg skal beklage hvis det ikke fremgik klart.
Avatar billede medions Nybegynder
22. maj 2003 - 09:34 #14
Hmm ok, det lyder vel logisk nok, men har du et direkte link til hvor jeg kan hente den?

//>Rune
Avatar billede arne_v Ekspert
22. maj 2003 - 09:39 #15
Avatar billede arne_v Ekspert
22. maj 2003 - 09:40 #16
B9 er lige releaset.

Og da jeg hentede den igår manglede jdom.jar så jeg måtte
selv builde med det medfølgende build script.

Det er jeg ret sikker på ikke var nødvendig for B8.
Avatar billede luctatic Nybegynder
22. maj 2003 - 12:33 #17
JDOM blev resultatet. Folk var aktive i går aftens lader det til.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester