From 45668245709225e6aefc8f28249e78de906002b7 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Wed, 18 Jan 2023 13:49:39 -0500 Subject: [PATCH] escape xml characters --- .../xmlencoder/ValuesStringPoolBuilder.java | 2 +- .../lib/apk/xmlencoder/XMLFileEncoder.java | 14 +-- .../apk/xmlencoder/XMLValuesEncoderAttr.java | 4 +- .../apk/xmlencoder/XMLValuesEncoderStyle.java | 33 ++++++- .../java/com/reandroid/xml/XMLAttribute.java | 13 --- .../java/com/reandroid/xml/XMLElement.java | 91 ++++--------------- src/main/java/com/reandroid/xml/XMLNode.java | 2 +- src/main/java/com/reandroid/xml/XMLText.java | 6 +- src/main/java/com/reandroid/xml/XMLUtil.java | 2 +- .../com/reandroid/xml/XmlHeaderElement.java | 6 +- 10 files changed, 61 insertions(+), 112 deletions(-) diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java b/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java index 7393d68..10fa61c 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java +++ b/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java @@ -162,7 +162,7 @@ import java.util.*; } } private void addStyleElement(XMLElement element){ - styleList.add(element.buildTextContent()); + styleList.add(element.buildTextContent(false)); } } diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java b/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java index f1f557a..c7e55e3 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java +++ b/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java @@ -96,9 +96,7 @@ public class XMLFileEncoder { } } private void buildAttributes(XMLElement element, ResXmlElement resXmlElement){ - int count=element.getAttributeCount(); - for(int i=0;i mAttributes = new ArrayList<>(); + private final LinkedHashMap mAttributes = new LinkedHashMap<>(); private final List mChildElements = new ArrayList<>(); private final List mComments = new ArrayList<>(); private final List mTexts = new ArrayList<>(); @@ -94,7 +94,7 @@ public class XMLElement extends XMLNode{ if(exist!=null){ exist.setValue(schemaAttr.getValue()); }else { - addAttributeNoCheck(schemaAttr); + addAttribute(schemaAttr); } } } @@ -254,8 +254,8 @@ public class XMLElement extends XMLNode{ mComments.clear(); mTexts.clear(); } - public List listAttributes(){ - return mAttributes; + public Collection listAttributes(){ + return mAttributes.values(); } public int getChildesCount(){ return mChildElements.size(); @@ -272,12 +272,6 @@ public class XMLElement extends XMLNode{ public int getAttributeCount(){ return mAttributes.size(); } - public XMLAttribute getAttributeAt(int index){ - if(index>=mAttributes.size()){ - return null; - } - return mAttributes.get(index); - } public String getAttributeValue(String name){ XMLAttribute attr=getAttribute(name); if (attr==null){ @@ -303,48 +297,11 @@ public class XMLElement extends XMLNode{ throw new XMLException(ex.getMessage()+": "+" '"+toString()+"'"); } } - public boolean getAttributeValueBool(String name, boolean def){ - XMLAttribute attr=getAttribute(name); - if (attr==null){ - return def; - } - if(!attr.isValueBool()){ - return def; - } - return attr.getValueBool(); - } - public boolean getAttributeValueBool(String name) throws XMLException { - XMLAttribute attr=getAttribute(name); - if (attr==null || !attr.isValueBool()){ - throw new XMLException("Expecting boolean for attr <"+name+ "> at '"+toString()+"'"); - } - return attr.getValueBool(); - } public XMLAttribute getAttribute(String name){ - if(XMLUtil.isEmpty(name)){ - return null; - } - for(XMLAttribute attr:mAttributes){ - if(name.equals(attr.getName())){ - return attr; - } - } - return null; + return mAttributes.get(name); } public XMLAttribute removeAttribute(String name){ - if(XMLUtil.isEmpty(name)){ - return null; - } - XMLAttribute attr=getAttribute(name); - if(attr==null){ - return null; - } - int i=mAttributes.indexOf(attr); - if(i<0){ - return null; - } - mAttributes.remove(i); - return attr; + return mAttributes.remove(name); } public XMLAttribute setAttribute(String name, int value){ return setAttribute(name, String.valueOf(value)); @@ -364,7 +321,7 @@ public class XMLElement extends XMLNode{ }else{ attr=new XMLAttribute(name,value); } - addAttributeNoCheck(attr); + addAttribute(attr); }else { attr.setValue(value); } @@ -382,20 +339,15 @@ public class XMLElement extends XMLNode{ if(attr==null){ return; } - if(XMLUtil.isEmpty(attr.getName())){ + String name = attr.getName(); + if(XMLUtil.isEmpty(name)){ return; } - XMLAttribute exist=getAttribute(attr.getName()); + XMLAttribute exist = mAttributes.get(name); if(exist!=null){ return; } - mAttributes.add(attr); - } - private void addAttributeNoCheck(XMLAttribute attr){ - if(attr==null || attr.isEmpty()){ - return; - } - mAttributes.add(attr); + mAttributes.put(name, attr); } public void sortChildes(Comparator comparator){ if(comparator==null){ @@ -403,12 +355,6 @@ public class XMLElement extends XMLNode{ } mChildElements.sort(comparator); } - public void sortAttributes(Comparator comparator){ - if(comparator==null){ - return; - } - mAttributes.sort(comparator); - } public XMLElement getParent(){ return mParent; } @@ -534,13 +480,13 @@ public class XMLElement extends XMLNode{ if(!hasTextContent()){ return null; } - return buildTextContent(); + return buildTextContent(true); } - public String buildTextContent(){ + public String buildTextContent(boolean unEscape){ StringWriter writer=new StringWriter(); try { for(XMLNode node:getChildNodes()){ - node.buildTextContent(writer); + node.buildTextContent(writer, unEscape); } writer.flush(); writer.close(); @@ -548,7 +494,7 @@ public class XMLElement extends XMLNode{ } return writer.toString(); } - void buildTextContent(Writer writer) throws IOException { + void buildTextContent(Writer writer, boolean unEscape) throws IOException { writer.write("<"); writer.write(getTagName()); appendAttributes(writer, false); @@ -558,7 +504,7 @@ public class XMLElement extends XMLNode{ } writer.write('>'); for(XMLNode node:getChildNodes()){ - node.buildTextContent(writer); + node.buildTextContent(writer, unEscape); } if(hasChildNodes()){ writer.write("0; } - void buildTextContent(Writer writer) throws IOException{ + void buildTextContent(Writer writer, boolean unEscape) throws IOException{ } public boolean write(Writer writer) throws IOException { diff --git a/src/main/java/com/reandroid/xml/XMLText.java b/src/main/java/com/reandroid/xml/XMLText.java index 5ebf73b..fed511b 100644 --- a/src/main/java/com/reandroid/xml/XMLText.java +++ b/src/main/java/com/reandroid/xml/XMLText.java @@ -21,7 +21,7 @@ import java.io.Writer; public class XMLText extends XMLNode{ private String text; public XMLText(String text){ - this.text=text; + this.text=XMLUtil.escapeXmlChars(text); } public XMLText(){ this(null); @@ -44,8 +44,8 @@ public class XMLText extends XMLNode{ this.text=XMLUtil.escapeXmlChars(text); } @Override - void buildTextContent(Writer writer) throws IOException{ - writer.write(this.text); + void buildTextContent(Writer writer, boolean unEscape) throws IOException{ + writer.write(getText(unEscape)); } @Override public boolean write(Writer writer, boolean newLineAttributes) throws IOException { diff --git a/src/main/java/com/reandroid/xml/XMLUtil.java b/src/main/java/com/reandroid/xml/XMLUtil.java index a1e8be6..5c403f0 100755 --- a/src/main/java/com/reandroid/xml/XMLUtil.java +++ b/src/main/java/com/reandroid/xml/XMLUtil.java @@ -29,7 +29,7 @@ public class XMLUtil { if(str==null){ return null; } - if(!PATTERN_ESCAPE.matcher(str).matches()){ + if(str.indexOf('&')<0 && str.indexOf('<')<0 && str.indexOf('>')<0){ return str; } str=str.replaceAll("&", "&"); diff --git a/src/main/java/com/reandroid/xml/XmlHeaderElement.java b/src/main/java/com/reandroid/xml/XmlHeaderElement.java index 1c7794a..357f224 100755 --- a/src/main/java/com/reandroid/xml/XmlHeaderElement.java +++ b/src/main/java/com/reandroid/xml/XmlHeaderElement.java @@ -35,9 +35,7 @@ package com.reandroid.xml; if(element==null){ return; } - int max=element.getAttributeCount(); - for(int i=0;i