为什么我的方法使用String.replace和HashMap不替换字符串?

时间:2015-05-05 18:45:48

标签: java string replace

我正在尝试编写一个小类来转义XML文档中的字符。我使用xpath来获取XML文档的节点,并将每个节点传递给我的类。但是,它不起作用。我想改变:

"I would like a burger & fries."

"I would like a burger & fries."

以下是我班级的代码:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MyReplace{
    private static final HashMap<String,String> xmlCharactersToBeEscaped;
    private Iterator iterator;
    private String newNode;
    private String mapKey;
    private String mapValue;

    static {
        xmlCharactersToBeEscaped = new HashMap<String,String>();
        xmlCharactersToBeEscaped.put("\"","&quot;");
        xmlCharactersToBeEscaped.put("'","&apos;");
        xmlCharactersToBeEscaped.put("<","&lt;");
        xmlCharactersToBeEscaped.put(">","&gt;");
        xmlCharactersToBeEscaped.put("&","&amp;");
    }

    public String replaceSpecialChar(String node){
        if(node != null){
            newNode = node;
            iterator = xmlCharactersToBeEscaped.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry mapEntry = (Map.Entry) iterator.next();
                mapKey = mapEntry.getKey().toString();
                mapValue = mapEntry.getValue().toString();

                if(newNode.contains(mapKey)){
                    newNode = newNode.replace(mapKey,mapValue);
                }
            }
            return newNode;
        } else {
            return node;
        }
    }
}

正在发生的事情是它正在替换地图中的第一个特殊字符,引用并跳过其他所有字符。

2 个答案:

答案 0 :(得分:4)

你的解决方案过于复杂。

使用StringEscapeUtils(Commons Lang库的一部分)。它具有内置功能,可以逃避和浏览XML,HTML等等。 Commons lang非常容易导入,以下示例来自最新的稳定版本(3.4)。以前的版本使用不同的方法,根据您的版本查找Java文档。它非常灵活,所以你可以用它做更多的事情,而不仅仅是简单的逃脱和失败。

String convertedString = StringEscapeUtils.escapeXml11(inputString);

如果您使用的是XML 1.0,他们还会提供以下内容

String convertedString10 = StringEscapeUtils.escapeXml10(inputString);

在此处获取:https://commons.apache.org/proper/commons-lang/

这里的Java文档(3.4):https://commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/apache/commons/lang3/StringEscapeUtils.html

答案 1 :(得分:2)

使其更简单(并参见下面的评论):

xmlCharactersToBeEscaped = new HashMap<String,String>();
xmlCharactersToBeEscaped.put("\"","&quot;");
xmlCharactersToBeEscaped.put("'","&apos;");
xmlCharactersToBeEscaped.put("<","&lt;");
xmlCharactersToBeEscaped.put(">","&gt;");
/* xmlCharactersToBeEscaped.put("&","&amp;"); <-- don't add this to the map */

//...
public String replaceSpecialChars(String node) {
    if (node != null) {
        String newNode = node.replace("&", "&amp;"); 
        for (Map.Entry<String, String> e : xmlCharactersToBeEscaped.entrySet()) {              
             newNode = newNode.replace(e.getKey(), e.getValue());
        }
        return newNode;
    } else {
        return null;
    }
}

或者更好地使用StringEscapeUtils来获取此类内容。