【问题标题】:Why is my method using String.replace and a HashMap not replacing the strings?为什么我使用 String.replace 和 HashMap 的方法没有替换字符串?
【发布时间】:2015-07-15 15:40:40
【问题描述】:

我正在尝试编写一个小类来转义 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;
        }
    }
}

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

【问题讨论】:

  • 天哪,这是我一生中见过的最不必要的复杂字符串替换方法。您肯定听说过String.replace 吗?或者只是使用内置的 XML 库。无论如何,他们都会为你做这一切。 stackoverflow.com/questions/439298/…
  • @tnw OP 对 String 实例执行替换,但是,我同意,访问过于复杂。
  • 这就是我正在使用的。我想要做的是遍历一组 5 个不同的“字符串”并将它们全部替换。另外,我想在它自己的班级里这样做。
  • 你能显示你的输入测试文件和输出吗?
  • 他们的意思是你不需要检查字符串是否包含要替换的东西,如果不存在,replace 只需返回原始字符串。此外,mapKey = mapEntry.getKey().toString(); 是多余的,toString() 在字符串中返回自身,mapKey = mapEntry.getKey(); 将起作用。

标签: java string replace


【解决方案1】:

您的解决方案过于复杂。

使用 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

【讨论】:

  • 我不知道 StringEscapeUtils ...非常酷,谢谢。
  • 很好!对于这些东西,我也更喜欢 Apache Commons。现在我的赞成票是你的
  • 如果您喜欢这个答案并且效果很好,请将其标记为解决方案。祝你好运布赖恩。来自 Apache 的通用库非常有用!如果你想自己写同样的东西,它都是开源的,你可以在这里看到他们是如何做到的:commons.apache.org/proper/commons-lang/javadocs/api-3.4/…
【解决方案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 来处理这些东西。

【讨论】:

  • 请注意,如果&amp; 不是第一个替换,当需要替换&amp; 时,所有以前的&amp;xxx 都将替换它们的&amp;
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多