Размер входного xml также необходимо учитывать при выборе решения.Для больших xmls, размером ~ 100 КБ, возможно, если ваш ввод от веб-службы, вам также нужно учитывать последствия сбора мусора при манипулировании большой строкой.Ранее мы использовали String.replaceAll, и это вызывало частые OOM в производстве с размером кучи 1,5 ГБ из-за способа реализации replaceAll.
Вы можете ссылаться на наши выводы http://app -inf.blogspot.com / 2013/04 / pitfalls-of-processing-large-string.html .
Я не уверен, как XSLT работает с большими объектами String, но мы закончили анализ строки вручную, чтобы удалить префиксы за один раз, чтобы избежать создания дополнительных больших объектов Java.
public static String removePrefixes(String input1) {
String ret = null;
int strStart = 0;
boolean finished = false;
if (input1 != null) {
//BE CAREFUL : allocate enough size for StringBuffer to avoid expansion
StringBuffer sb = new StringBuffer(input1.length());
while (!finished) {
int start = input1.indexOf('<', strStart);
int end = input1.indexOf('>', strStart);
if (start != -1 && end != -1) {
// Appending anything before '<', including '<'
sb.append(input1, strStart, start + 1);
String tag = input1.substring(start + 1, end);
if (tag.charAt(0) == '/') {
// Appending '/' if it is "</"
sb.append('/');
tag = tag.substring(1);
}
int colon = tag.indexOf(':');
int space = tag.indexOf(' ');
if (colon != -1 && (space == -1 || colon < space)) {
tag = tag.substring(colon + 1);
}
// Appending tag with prefix removed, and ">"
sb.append(tag).append('>');
strStart = end + 1;
} else {
finished = true;
}
}
//BE CAREFUL : use new String(sb) instead of sb.toString for large Strings
ret = new String(sb);
}
return ret;
}