Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Why not parse the XML manually?</p> <pre><code>import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import junit.framework.Assert; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class ReplaceTextInXmlTest { @Test public void test( ) { try { final String inputXml = new String( "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n" + "&lt;rootTag&gt;\n" + " &lt;dictionary&gt;\n" + " &lt;name&gt;field1&lt;/name&gt;\n" + " &lt;address&gt;field2&lt;/address&gt;\n" + " &lt;gender&gt;field3&lt;/gender&gt;\n" + " &lt;/dictionary&gt;\n" + " &lt;records&gt;\n" + " &lt;record&gt;\n" + " &lt;field id=\"field1\"&gt;John&lt;/field&gt;\n" + " &lt;field id=\"field2\"&gt;Svalbard&lt;/field&gt;\n" + " &lt;field id=\"field3\"&gt;M&lt;/field&gt;\n" + " &lt;/record&gt;\n" + " &lt;field id=\"field1\"&gt;Fritz&lt;/field&gt;\n" + " &lt;field id=\"field2\"&gt;Hamburg&lt;/field&gt;\n" + " &lt;field id=\"field3\"&gt;M&lt;/field&gt;\n" + " &lt;/record&gt;\n" + " &lt;/records&gt;\n" + "&lt;/rootTag&gt;" ); final Map&lt;Integer, String&gt; mapping = new HashMap&lt;&gt;(); final int start = inputXml.indexOf("&lt;dictionary&gt;"); final int end = inputXml.indexOf("&lt;/dictionary&gt;", start) + 13; // "&lt;/dictionary&gt;".length() = 13 final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); final DocumentBuilder db = dbf.newDocumentBuilder(); Document dom = null; try ( ByteArrayInputStream is = new ByteArrayInputStream(inputXml.substring(start, end).getBytes()); ) { dom = db.parse(is); } final Element root = dom.getDocumentElement(); final NodeList nodes = root.getChildNodes(); for(int i = 0, z = nodes.getLength(); i &lt; z; ++i) { final Node node = nodes.item(i); final int type = node.getNodeType(); if(type == 1) { final String name = node.getNodeName(); final String value = node.getTextContent(); mapping.put(new Integer(Integer.parseInt(value.substring(5))), name); // "field".length() = 5 } } final Pattern fieldPattern = Pattern.compile("^(\\s*&lt;)field id=\"field([0-9]+)\" (&gt;[^&lt;]*&lt;/)field(&gt;\\s*)$"); final StringBuilder outputXml = new StringBuilder(); try ( BufferedReader reader = new BufferedReader(new StringReader(inputXml)); ) { String line = null; while ((line = reader.readLine()) != null) { final Matcher match = fieldPattern.matcher(line); if(match.find() == true) { final int fieldId = Integer.parseInt(match.group(2)); final String tagName = mapping.get(new Integer(fieldId)); outputXml.append(match.group(1)); outputXml.append(tagName); outputXml.append(match.group(3)); outputXml.append(tagName); outputXml.append(match.group(4)); } else { outputXml.append(line); } outputXml.append('\n'); } } final String expectedXml = new String( "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n" + "&lt;rootTag&gt;\n" + " &lt;dictionary&gt;\n" + " &lt;name&gt;field1&lt;/name&gt;\n" + " &lt;address&gt;field2&lt;/address&gt;\n" + " &lt;gender&gt;field3&lt;/gender&gt;\n" + " &lt;/dictionary&gt;\n" + " &lt;records&gt;\n" + " &lt;record&gt;\n" + " &lt;name&gt;John&lt;/name&gt;\n" + " &lt;address&gt;Svalbard&lt;/address&gt;\n" + " &lt;gender&gt;M&lt;/gender&gt;\n" + " &lt;/record&gt;\n" + " &lt;name&gt;Fritz&lt;/name&gt;\n" + " &lt;address&gt;Hamburg&lt;/address&gt;\n" + " &lt;gender&gt;M&lt;/gender&gt;\n" + " &lt;/record&gt;\n" + " &lt;/records&gt;\n" + "&lt;/rootTag&gt;\n" ); Assert.assertEquals(expectedXml, outputXml.toString()); } catch (final Exception e) { Assert.fail(e.getMessage()); } } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload