Forum: PC-Programmierung Java formaler Ausdruck aus XML Datei laden


von chr i. (chris-86)


Lesenswert?

Guten Tag!
Ich verwende eine XML Struktur
1
ersetze.xml:
2
<root>
3
<ersetze>=<durch> = </durch> </ersetze>
4
<ersetze>\w\w<durch> </durch> </ersetze>
5
6
</root>
7
um im Java einen String zu durchsuchen und entsprechend zu ersetzen. Dies wird durch folgenden Code realisiert:
8
[c]
9
    private static String find_replace(String source) throws IOException,
10
            ParserConfigurationException, SAXException, XPathExpressionException {
11
        String result = new String(source);
12
        String ersetze = "";
13
        String durch = "";
14
        try {
15
            DocumentBuilderFactory factory_j =
16
                    DocumentBuilderFactory.newInstance();
17
18
            factory_j.setNamespaceAware(true);
19
            DocumentBuilder builder_j = factory_j.newDocumentBuilder();
20
            Document doc_j = builder_j.parse("T:\\ersetze.xml");
21
            XPathFactory xfactory_j = XPathFactory.newInstance();
22
            XPath xpath_j = xfactory_j.newXPath();
23
            XPathExpression expr_j = xpath_j.compile("//ersetze");
24
            Object result_j = expr_j.evaluate(doc_j,
25
                    XPathConstants.NODESET);
26
27
            NodeList nodes_j = (NodeList) result_j;
28
29
            for (int i = 0; i < nodes_j.getLength(); i++) {
30
31
                XPathExpression expr_j_se =
32
                        xpath_j.compile("self::*/text()");
33
34
                Object result_j_se = expr_j_se.evaluate(nodes_j.item(i),
35
                        XPathConstants.NODESET);
36
                NodeList nodes_j_se = (NodeList) result_j_se;
37
                ersetze = nodes_j_se.item(0).getNodeValue();
38
            
39
                expr_j_se = xpath_j.compile("self::*/durch/text()");
40
41
                result_j_se = expr_j_se.evaluate(nodes_j.item(i),
42
                        XPathConstants.NODESET);
43
                nodes_j_se = (NodeList) result_j_se;
44
                durch = nodes_j_se.item(0).getNodeValue();
45
          
46
47
48
49
                Pattern replace = Pattern.compile(ersetze.trim());
50
                Matcher matcher2 = replace.matcher(result);
51
                result = matcher2.replaceAll(durch);
52
53
54
            }
55
56
        } catch (Exception ex) {
57
            ex.printStackTrace();
58
        }
59
       
60
        return result;
61
62
    }

Prinzipiell funktioniert das auch. Bei oben stehender XML Datei möchte 
ich 2 Leerzeichen durch ein einfaches ersetzen. Der formale Ausdruck für 
ein doppeltes Leerzeichen ist \w\w aber dennoch wird durch die XML datei 
und oben stehende Java Funktion die gewünscht Ersetzung (2 Durch 1 
Leerzeichen) nicht ausgeführt. Habt ihr eine Idee, was daran falsch ist?

Schöne Grüße ,
Chris

: Verschoben durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

chr is schrieb:
> ein doppeltes Leerzeichen ist \w\w

Aha? Whitespace sind eigentlich \s oder \f für ein "echtes" Leerzeichen 
wenn ich das jetzt richtig im Kopf hab \w ist ein "word character".

Unabhängig davon teste das doch mit einem eigenem Programm bevor du das 
in eine komplexeren Zusammenhang stellst.

von chr i. (chris-86)


Lesenswert?

ich habe den Fehler weiter eingegrenzt. Kann es sein, dass es zwei Arten 
von Leerzeichen gibt?
h  llo (1)

h  llo (2)

Ausdruck  Nr.  2 habe ich hier eingetippt, Ausdruck Nr 1 ist  der nicht 
in Java erkannte.
Bei Markierung der Leerzeichen mit der Maus muss man jeweils zwei 
Bewegungen machen.) Jedoch sind die Ausdrücke unterschiedlich lang.
Unten stehender Ausdruck Nr. 2 wird erkannt, Nr. 1 sollte aber auch mit 
\s\s gemached werden.

Viele Grüße

Chris

von chr i. (chris-86)


Lesenswert?

lag am Zeichensatz, sorry;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.