Avatar billede luctatic Nybegynder
22. maj 2003 - 15:09 Der er 3 kommentarer og
2 løsninger

JDOM, remove()

Hvis man du har et kort xml-dokument der ser sådan her ud:

<root>
  <a>
    <b>
      <c>1</c>
      <c>2</c>
      <c>3</c>
    </b>
  </a>
</root>

Og nu vil man så slette en af C-elementerne. I JDOM findes der kun 3 remove-metoder: removeChild, removeAtribute og removeContent. Men hvordan kan man bestemme af det er c-elementet med værdien 2 der skal slettes? removeChild ta'r et navn på elementet og et namespace ind, og så kan man kun komme til at skrive removeChild("c", "b"); så man får fjernet elementet 'c' i namespace 'b'. Men der kan man jo ikke bestemme hvilket C-element det er, og derfor fjernes bare det første.

En anden mulighed var removeChild("2", "c"); hvor man bruger 'c' som namespace, men selvom det virker, vil det resultere i et tomt c-element. Nogen bud?
Avatar billede arne_v Ekspert
22. maj 2003 - 16:12 #1
Du finder vil det Element der skal fjernes og kalder
removeContent på parent med elementet som argument.

PS: Namespace er ikke det samme osm nestet tag.
Avatar billede arne_v Ekspert
22. maj 2003 - 16:13 #2
Men du bliver nødt til "manuelt" at finde det <c></c> der har
værdien 2.
Avatar billede luctatic Nybegynder
22. maj 2003 - 16:34 #3
Det viste sig at være relativt enkelt i JDOM da den implementerer java.util.List på en meget hyggelig måde. Hvis man lave en liste:

List list = doc.getRootElement().getChild("a").getChild("b").getChildren();
og så søger denne liste igennem:

for(int i=0;i<list.size();i++)
{
  Element e = (Element)list.get(i);
  if(e.getText().equals("2"))
    list.remove(i);
}



Nu har man så ændret i sin liste, og helt automatisk bliver det bagvedliggende Document doc ændret. Så det viste sig at være ekstremt nemt.

Men mon ikke det du sagde virker også.
Avatar billede arne_v Ekspert
22. maj 2003 - 16:55 #4
Det gør det.

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

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 AddRemoveElement {
    public static void main(String[] args) {
        try {
            DOMAdapter adapt = new XercesDOMAdapter();
            org.w3c.dom.Document w3cdoc = adapt.getDocument(new FileInputStream("C:\\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);
            List lst = doc.getRootElement().getChildren();
            for(int i = 0; i < lst.size(); i++) {
                Element elm = (Element)lst.get(i);
                if(elm.getText().equals("2")) {
                    elm.getParent().removeContent(elm);
                }
            }
            xmlout.output(doc, System.out);
            for(int i = 0; i < lst.size(); i++) {
                Element elm = (Element)lst.get(i);
                if(elm.getText().equals("3")) {
                    lst.remove(i);
                }
            }
            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);
        }
    }
}

outputter:

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

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


<f>4</f></allf>
Avatar billede arne_v Ekspert
22. maj 2003 - 17:06 #5
Men det er smart at List'en ikke er en kopi.

Der er også mange som siger at JDOM er smart. Jeg har ikke selv
brugt det så meget - mest SAX og en smule W3C DOM.
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