Avatar billede mik28 Seniormester
15. november 2010 - 16:25 Der er 23 kommentarer og
1 løsning

Decode/Encode

Hvordan er det lige jeg får decoded en String. Jeg kan gøre sådan her for alle tegn, men det er noget klodset

output = output.replaceAll("&lt;","<");
Avatar billede arne_v Ekspert
15. november 2010 - 16:33 #1
Hvis det er XML boer en XML parser haandtere det automatisk for dig.
Avatar billede mik28 Seniormester
15. november 2010 - 16:37 #2
Jeg gør sådan her

String output = XPathAPI.selectSingleNode(trae, "etellerandet/text()").toString();

Det jeg modtager er encoded.
Avatar billede mik28 Seniormester
15. november 2010 - 16:50 #3
Min klasse ser på nuværende tidspunkt således ud. Jeg vil meget gerne have input til hvordan jeg optimerer den.

public class Minklasse {

    public String getMininfo(String url) {

    HttpClient client = new HttpClient();

    client.getHttpConnectionManager().getParams().setConnectionTimeout(1000);
    client.getHttpConnectionManager().getParams().setSoTimeout(5000);

    GetMethod method = new GetMethod(url);
    try{
    client.executeMethod(method);
    }
    catch (Exception e){
    }
        String s ="";
        try {
            s = "<all>"+method.getResponseBodyAsString()+"</all>";
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(s)));
            Node n =  XPathAPI.selectSingleNode(trae, "all/LADIDA/text()");
            String output = n.toString();
            output = output.replaceAll("&lt;","<");
            output = output.replaceAll("&gt;",">");
            output = output.replaceAll("<br />","");
            return output;
        }catch (Exception e) {
        e.printStackTrace();
        }
    return "";
    }

}
Avatar billede arne_v Ekspert
15. november 2010 - 16:51 #4
Hvad med:

String output = XPathAPI.selectSingleNode(trae, "etellerandet/text()").getNodeValue();

?
Avatar billede arne_v Ekspert
15. november 2010 - 17:05 #5
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;

public class Esc {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader("<all><foobar>&lt;bla bla&gt;</foobar></all>")));
        Node n =  XPathAPI.selectSingleNode(trae, "//all/foobar/text()");
        System.out.print(n.getNodeValue());
    }
}

udskriver korrekt <>.
Avatar billede mik28 Seniormester
15. november 2010 - 19:30 #6
cool nok. Jeg må lige prøve igen i morgen, må jo have gjort et eller andet forkert så. Læg endelig et svar så jeg kan lukke
Avatar billede arne_v Ekspert
15. november 2010 - 19:37 #7
svar
Avatar billede mik28 Seniormester
16. november 2010 - 09:51 #8
Det virker altså ikke. Jeg får det encodede resultat tilbage :-(
Avatar billede arne_v Ekspert
16. november 2010 - 15:44 #9
Ogsaa med mit lille standalone eksempel?
Avatar billede mik28 Seniormester
17. november 2010 - 09:55 #10
giver mig
[#text: <bla bla>]
Avatar billede mik28 Seniormester
17. november 2010 - 09:59 #11
Det er sådan set ikke fordi jeg ikke kan få det til at virke :-)
Det handler mere om jeg ikke syntes det er så kønt med en masse
output = output.replaceAll("&lt;","<");

Der må da være en mere elegant løsning.
Avatar billede mik28 Seniormester
17. november 2010 - 10:19 #12
Hvordan ligger jeg en metode ind som encoder for mig i Minklasse

  output = output.replaceAll("&lt;","<");
  output = output.replaceAll("&gt;",">");
  output = output.replaceAll("<br />","");
Avatar billede mik28 Seniormester
17. november 2010 - 11:06 #13
hvorfor kan jeg ikke gøre sådan her

private String encode(String s){
        s.replaceAll("&lt;","<");
        s.replaceAll("&gt;",">");
        s.replaceAll("&quot;","\\\"");
        s.replaceAll("\\[","");
        s.replaceAll("#cdata-section:","");
        s.replaceAll("]","");
        s.replaceAll("<br />","");
        return s;
       
    }

også kalde den med
output = encode(output);

Får at vide replaceAll bliver ignored
Avatar billede mik28 Seniormester
17. november 2010 - 12:12 #14
Har fundet ud af det det skal være

s=s.replaceAll("&lt;","<");

Kan jeg lægge

HttpClient client = new HttpClient();

    client.getHttpConnectionManager().getParams().setConnectionTimeout(1000);
    client.getHttpConnectionManager().getParams().setSoTimeout(5000);

    GetMethod method = new GetMethod(url);
    try{
    client.executeMethod(method);
    }
    catch (Exception e){
    }

ud på en måde så jeg kan genbruge det i klassen. Jeg påtænker at have en del forskellige getMininfo metoder
Avatar billede arne_v Ekspert
18. november 2010 - 02:10 #15
Du kan altid pakke noget kode ind i en genbrugelig metode.
Avatar billede arne_v Ekspert
18. november 2010 - 02:11 #16
Men:

[#text: <bla bla>]

lyder altså meget som:

n.toString()

og ikke:

n.getNodeValue()
Avatar billede mik28 Seniormester
18. november 2010 - 10:54 #17
Det er altså det sidste jeg gør. Det skal dog lige siges at metoden  returnerer en String, så det kan jo være at JAVA hjælper mig :-)

public String getMininfo(String url) {}

Jeg har lavet min egen Decode metode

private String decode(String s){
        //Decode content in order for it to render correctly
        s=s.replaceAll("&lt;","<");
        s=s.replaceAll("&gt;",">");
        s=s.replaceAll("&quot;","\\\"");
        return s.trim();
    }

som jeg bruger nu. Kan dog ikke forstå den funktionalitet ikke allerede findes. Det gør den vel også jeg kan bare ikke finde den :-)
Avatar billede arne_v Ekspert
29. november 2010 - 03:52 #18
Avatar billede mik28 Seniormester
29. november 2010 - 16:46 #19
Har kigget på det, men forstår ikke helt hvad jeg skal bruge det til :-(
Avatar billede mik28 Seniormester
30. november 2010 - 07:43 #21
jamen det vil jeg da prøve :-)
Avatar billede mik28 Seniormester
30. november 2010 - 10:34 #22
Bliver aldrig helt klog på det her burde

return StringEscapeUtils.escapeXml(n.getNodeValue());

ikke gøre det samme som

return decode(n.getNodeValue());

hvor decode er

private String decode(String s){
        s=s.replaceAll("&lt;","<");
        s=s.replaceAll("&gt;",">");
        s=s.replaceAll("&quot;","\\\"");
        return s.trim();
    }

Jeg kan fortælle at det første ikke virker men heller ikke giver nogen fejl
Avatar billede mik28 Seniormester
30. november 2010 - 13:54 #23
Vor herre til hest

return StringEscapeUtils.unescapeXml(n.getNodeValue());

er jo nok lidt smartere når det er det jeg gerne vil DOOOOOHHHHHH!!!! (ekko)
Avatar billede arne_v Ekspert
01. december 2010 - 01:38 #24
:-)
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