Avatar billede mungojerrie Nybegynder
22. juni 2004 - 15:09 Der er 17 kommentarer og
1 løsning

Størrelse af xml document

Hvordan finder man på nemmeste vis størrelsen på et xml document, altså hvormange elementer indeholder documentet ?
Avatar billede simonvalter Praktikant
22. juni 2004 - 15:27 #1
Du har jeg ikke lige kigget nærmere på det, men med sax vil jeg tro du kan lave en tæller der tæller op ved hvert endElement

Det kan godt være jeg har overset noget her men det kan også godt være at man kan gøre dette


BufferedReader in = new BufferedReader(new FileReader("infilename.xml"));
        String str;
        while ((str = in.readLine()) != null) {
            process(str);
        }

og så teste med en regular expression om du møder et endelement
Avatar billede simonvalter Praktikant
22. juni 2004 - 15:29 #2
arne_v har et par artikler om xml i java.
det ville også være muligt med dom men det kan nok ikke betale sig.

regular expressions kan du læse om her
http://java.sun.com/docs/books/tutorial/extra/regex/
Avatar billede mungojerrie Nybegynder
22. juni 2004 - 15:38 #3
okay, jeg læser ikke min fil fra disken, men benytter et document til at transportere mine data, så jeg står bare med et org.w3c.dom.Document. Vil det ændre på noget?
Avatar billede mungojerrie Nybegynder
22. juni 2004 - 15:38 #4
mit document skabes udfra et resultset fra min db.
Avatar billede simonvalter Praktikant
22. juni 2004 - 15:42 #5
NodeList elements = doc.getElementsByTagName("elementname");
elements.getLength()

på den måde kan du gennemløbe dit træ og tælle op.. du starter bare fra root elementet.

men vil det ikke være muligt og få antallet når du opretter documentet?
Avatar billede arne_v Ekspert
22. juni 2004 - 15:59 #6
Hvis du vil tælle alle elementer vil jeg foreslå en walker !
Avatar billede arne_v Ekspert
22. juni 2004 - 16:03 #7
Se artiklen "Mere XML med Java", gå ned i bunden og find ScanWithWalker
eksemplet og genbrug den logik, men bar elad while løkken tælle op i.s.f.
at udskrive.
Avatar billede simonvalter Praktikant
22. juni 2004 - 16:20 #8
Avatar billede arne_v Ekspert
22. juni 2004 - 16:30 #9
Hvis det er en bestemt slags tags så er getElementsByTagName løsningen.

Men lige netop til alle elemnter er walkeren smart.
Avatar billede mungojerrie Nybegynder
23. juni 2004 - 12:30 #10
glimrende, smid lige et svar....
Avatar billede arne_v Ekspert
23. juni 2004 - 12:32 #11
Mig ?
Avatar billede mungojerrie Nybegynder
23. juni 2004 - 13:05 #12
Ja, det blev dig igen arne, da jeg brugte din løsning, tilrettet....
Avatar billede mungojerrie Nybegynder
25. juni 2004 - 13:39 #13
Fandt faktisk også et par andre måder at klare opgaven på

    public static int getNumberOfElements(Document doc, String xpath)
    {
        // Set up a DOM tree to query.
        DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
        dfactory.setNamespaceAware(true);
       
        // Create an XPath evaluator and pass in the document.
        XPathEvaluator evaluator = new XPathEvaluatorImpl(doc);
        XPathNSResolver resolver = evaluator.createNSResolver(doc);
         
        // Evaluate the xpath expression
        XPathResult result = (XPathResult)evaluator.evaluate(xpath, doc, resolver, XPathResult.NUMBER_TYPE, null);
        return (int)(result.getNumberValue());
    }

    public static int getSize(Document doc, String tagName){
            //given an XML document and a tag name
            //return the number of occurances
            NodeList rows = doc.getElementsByTagName(tagName);
            return rows.getLength();
    }
Avatar billede simonvalter Praktikant
25. juni 2004 - 14:22 #14
Den ser godt nok ikke ud til at virke her.
som jeg forstår den så henter den en værdi fra et element
f.eks getNumberOfElements(doc,"/all/one)
hvor doc er
<all>
    <one>1</one>
    <one>2</one>
    <one>3</one>
</all>

vil retunere 1.0

altså værdien fra det første element som har den path
for at få alle værdier skal der itereres over dem.

Men jeg har ikke rodet med det før så jeg kan tage fejl.
Avatar billede simonvalter Praktikant
25. juni 2004 - 14:27 #15
xpath /all wil retunere 123.0 og hvis du ikke har nogen tal vil du bare få NaN og cast til int giver 0.
Avatar billede simonvalter Praktikant
25. juni 2004 - 14:43 #16
ok nu er jeg med

getNumberOfElements(doc,"count(//*)");
Avatar billede simonvalter Praktikant
25. juni 2004 - 14:51 #17
har iøvrigt lige lavet en test og walkeren må siges at være lidt hurtigere.. godt nok ikkke lige så fleksibel.

50000 Kald
Xpath : 27391 milli seconds
Walker : 62 milli seconds
Avatar billede arne_v Ekspert
25. juni 2004 - 23:00 #18
XPath kan lave rigtigt mange sjove ting.

Men måske lidt af et overkill til bare at tælle antal elementer.

Men det kan laves på mange måder.

Man kunne også nemt selv løbe træet igennem. Eventuelt rekursivt.

Walkeren er bare nem derved at det er minimalt kode man skal skrive.
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