2016-05-07 1 views
1

Ich habe die folgende XML-Java ersetzen Wörter innerhalb xml

<some tag> 
    <some_nested_tag attr="Hello"> Text </some_nested_tag> 
    Hello world Hello Programming 
</some tag> 

Aus der obigen xml, ich die Vorkommen des Wortes „Hallo“ zu ersetzen, die Teil des Tag-Inhalt sind aber nicht Teil des Tag-Attributs .

Ich möchte die folgende Ausgabe (Ersetzen Hallo von HALLO):

<some tag> 
    <some_nested_tag attr="Hello"> Text </some_nested_tag> 
    HI world HI Programming 
</some tag> 

ich java regex versucht und auch einige der DOM-Parser-Tutorials, aber ohne Erfolg. Ich poste hier um Hilfe, da ich nur begrenzte Zeit zur Verfügung habe, um dies in meinem Projekt zu beheben. Hilfe wäre willkommen.

+1

Regex ist NICHT der Weg, dies zu tun. Besser es zu parsen und den Tag-Inhalt zu modifizieren. – duffymo

Antwort

2

Dies kann mit einem negativen Lookbehind durchgeführt werden.

diese regex Versuchen:

(?<!attr=")Hello 

Es Hallo übereinstimmen, die von attr = nicht vorangeht.

So könnte man dies versuchen:

str = str.replaceAll("(?<!attr=")Hello", "Hi"); 

Es kann auch durch negative Vorschau erfolgen:

Hello(?!([^<]+)?>) 
+1

Jup, funktioniert wie ein Charme http://refiddle.com/9e1t –

+0

Danke für Ihre Antwort, aber es kann jeder Attributname sein, ich hatte 'attr' zum Beispiel –

+0

Die Antwort mit negativem Lookahead aktualisiert. –

0
string.replaceAll("(?i)\\shello\\s", " HI "); 

Regex Erläuterung:


Regex101 Demo

0

XSLT ist eine Sprache für Dokumente in andere XML-Dokumente XML-Transformation. Sie können alle Textknoten mit 'Hallo' abgleichen und den Inhalt dieser Knoten ersetzen.

Ein kleines Beispiel von XSLT in Java unter Verwendung von:

import javax.xml.transform.*; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 

public class TestMain { 
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException { 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     Source xslt = new StreamSource(new File("transform.xslt")); 
     Transformer transformer = factory.newTransformer(xslt); 

     Source text = new StreamSource(new File("input.xml")); 
     transformer.transform(text, new StreamResult(new File("output.xml"))); 
    } 
} 

Es ist eine gute Frage war Zeichenfolge mit XSLT zu ersetzen - Sie können ein Beispiel für XSLT-Vorlage finden dort: XSLT string replace

0

Hier ist ein voll funktionsfähiges Beispiel mit SAX-Parser. Es ist angepasst an Ihren Fall mit minimalen Änderungen von this example

Die tatsächliche Ersetzung erfolgt in MyCopyHandler # endElement() und MyCopyHandler # startElement() und der Textinhalt des XML-Elements wird in MyCopyHandler # characters() gesammelt. Beachten Sie auch die Pufferwartung - wichtig bei der Verarbeitung von Inhalten gemischter Elemente (Text- und Kindelemente)

Ich weiß, XSLT-Lösung ist auch möglich, aber es ist nicht so portabel.

public class XMLReplace { 

    /** 
    * @param args 
    * @throws SAXException 
    * @throws ParserConfigurationException 
    */ 
    public static void main(String[] args) throws Exception { 

     final String str = "<root> Hello <nested attr='Hello'> Text </nested> Hello world Hello Programming </root>"; 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser parser = spf.newSAXParser(); 
     XMLReader reader = parser.getXMLReader(); 
     reader.setErrorHandler(new MyErrorHandler()); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PrintWriter out = new PrintWriter(baos); 
     MyCopyHandler duper = new MyCopyHandler(out); 
     reader.setContentHandler(duper); 
     InputSource is = new InputSource(new StringReader(str)); 
     reader.parse(is); 
     out.close(); 
     System.out.println(baos); 
    } 

} 

class MyCopyHandler implements ContentHandler { 
    private boolean namespaceBegin = false; 

    private String currentNamespace; 

    private String currentNamespaceUri; 

    private Locator locator; 

    private final PrintWriter out; 

    private final StringBuilder buffer = new StringBuilder(); 

    public MyCopyHandler(PrintWriter out) { 
     this.out = out; 
    } 

    public void setDocumentLocator(Locator locator) { 
     this.locator = locator; 
    } 

    public void startDocument() { 
    } 

    public void endDocument() { 
    } 

    public void startPrefixMapping(String prefix, String uri) { 
     namespaceBegin = true; 
     currentNamespace = prefix; 
     currentNamespaceUri = uri; 
    } 

    public void endPrefixMapping(String prefix) { 
    } 

    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) { 

     // Flush buffer - needed in case of mixed content (text + elements) 
     out.print(buffer.toString().replaceAll("Hello", "HI")); 
     // Prepare to collect element text content 
     this.buffer.setLength(0); 

     out.print("<" + qName); 
     if (namespaceBegin) { 
      out.print(" xmlns:" + currentNamespace + "=\"" + currentNamespaceUri + "\""); 
      namespaceBegin = false; 
     } 
     for (int i = 0; i < atts.getLength(); i++) { 
      out.print(" " + atts.getQName(i) + "=\"" + atts.getValue(i) + "\""); 
     } 
     out.print(">"); 
    } 

    public void endElement(String namespaceURI, String localName, String qName) { 
     // Process text content 
     out.print(buffer.toString().replaceAll("Hello", "HI")); 
     out.print("</" + qName + ">"); 
     // Reset buffer 
     buffer.setLength(0); 
    } 

    public void characters(char[] ch, int start, int length) { 
     // Store chunk of text - parser is allowed to provide text content in chunks for performance reasons 
     buffer.append(Arrays.copyOfRange(ch, start, start + length)); 
    } 

    public void ignorableWhitespace(char[] ch, int start, int length) { 
     for (int i = start; i < start + length; i++) 
      out.print(ch[i]); 
    } 

    public void processingInstruction(String target, String data) { 
     out.print("<?" + target + " " + data + "?>"); 
    } 

    public void skippedEntity(String name) { 
     out.print("&" + name + ";"); 
    } 
} 

class MyErrorHandler implements ErrorHandler { 
    public void warning(SAXParseException e) throws SAXException { 
     show("Warning", e); 
     throw (e); 
    } 

    public void error(SAXParseException e) throws SAXException { 
     show("Error", e); 
     throw (e); 
    } 

    public void fatalError(SAXParseException e) throws SAXException { 
     show("Fatal Error", e); 
     throw (e); 
    } 

    private void show(String type, SAXParseException e) { 
     System.out.println(type + ": " + e.getMessage()); 
     System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); 
     System.out.println("System ID: " + e.getSystemId()); 
    } 
}