Search code examples
javaxmldtdstax

Write unescaped attribute with XMLStreamWriter


I'm trying to write a custom entity as an attribute value:

out.writeAttribute("storeent_id", "&MAR_STOREENT_ID;");

Desired:

<dmactivity
  dmactivity_id="@dmactivity_id_collateral_21003"
  storeent_id="&MAR_STOREENT_ID;"
  optcounter="0"
/>

actual

<dmactivity
    dmactivity_id="@dmactivity_BoysPantsRow2_Content"
    storeent_id="&amp;MAR_STOREENT_ID;"
    optcounter="0"
/>

Solution

  • Made a custom Writer, which will replace MYENTITY_MAR_STOREENT_ID: with &MAR_STOREENT_ID; . Suitable for small xmls.

    public class ReplacingWriter extends StringWriter {
    
        protected Writer out;
    
        public ReplacingWriter(Writer out) {
            this.out = out;
        }
    
        @Override
        public void close() throws IOException {
            String s = toString();
            for (int i = 0, len = rules.size(); i < len;) {
                String a = rules.get(i++);
                String b = rules.get(i++);
                s = s.replaceAll(a, b);
            }
            out.write(s);
            out.close();
        }
    
        private final ArrayList<String> rules = new ArrayList<String>();
    
        public void addRule(String regex, String replacement) {
            rules.ensureCapacity(rules.size() + 2);
            rules.add(regex);
            rules.add(replacement);
        }
    }
    ...
    Serializer ser = processor.newSerializer();
    rwr = new ReplacingWriter(fos);
    rwr.addRule("MYENTITY_([^:]*):", "&$1;");
    ser.setOutputWriter(rwr);
    ...
    Serializer ser = processor.newSerializer();
    rwr = new ReplacingWriter(fos);
    rwr.addRule("MYENTITY_([^:]*):", "&$1;");
    ser.setOutputWriter(rwr);
    ...
    out.writeAttribute("storeent_id", "MYENTITY_MAR_STOREENT_ID:");