Avatar billede f2f4 Novice
16. september 2008 - 16:22 Der er 4 kommentarer og
1 løsning

Avanceret søg og erstat

Xml eksempel:
<aaa>hej med dig</aaa>
<bbb>
  <ccc>1</ccc>
</bbb>

Jeg skal ændre indholdet <ccc> tagét fra 1 til 2 hvis <aaa> taget slutter på 'dig'?

Dette kan selvfølgelig laves med xslt og xpath ting og sager, men er der en hurtigere måde (evt. program) til den slags avancerede søg og erstat i xml filer.
Avatar billede arne_v Ekspert
16. september 2008 - 16:59 #1
Det er nemt at programmere selv. Hvilke programmerings sprog kender du ?
Avatar billede f2f4 Novice
17. september 2008 - 02:42 #2
Delphi, evt. Java eller C# :-)
Avatar billede arne_v Ekspert
17. september 2008 - 13:38 #3
Ikke specielt koent men foelgende Java ser ud til at virke:

import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;

public class Replace {
    public static void main(String[] args) throws Exception {
        // load
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse("C:\\replace.xml");
        // modify
        XPath xpath = XPathFactory.newInstance().newXPath();
        Node n = (Node)xpath.evaluate("//all[contains(aaa,'dig') and substring-after(ccc,'dig')='']/bbb[ccc='1']/ccc/text()", doc.getDocumentElement(), XPathConstants.NODE);
        if(n != null) {
            n.setTextContent("2");
        }
        // save
        DOMImplementation impl = DOMImplementationRegistry.newInstance().getDOMImplementation("XML 3.0");
        DOMImplementationLS feature = (DOMImplementationLS)impl.getFeature("LS","3.0");
        LSSerializer ser = feature.createLSSerializer();
        LSOutput output = feature.createLSOutput();
        output.setByteStream(new FileOutputStream("C:\\replace2.xml"));
        ser.write(doc, output);    }
}

testet med:

<all>
<aaa>hej med dig</aaa>
<bbb>
  <ccc>1</ccc>
</bbb>
</all>
Avatar billede f2f4 Novice
17. september 2008 - 16:31 #4
Super enkelt egentlig, mange tak ... giv et svar.
Avatar billede arne_v Ekspert
17. september 2008 - 16:33 #5
ok
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