Java 用空格分割的字符串不起作用

Java String split by whitespace not working

我正在尝试将输入字符串传递到 HashMap 的 ArrayList 中,并为其编写了一个方法。

public static ArrayList<HashMap<String, String>> tagSeparator (String input) {
    ArrayList<HashMap<String, String>> listOfTags = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> newTags = new HashMap<String, String>();        
    for (String eachLine: input.split("/>")) {
        eachLine = (eachLine.trim()).substring(eachLine.indexOf("<")+1);
        newTags.put("TagName", eachLine.substring(0, eachLine.indexOf(" ")));
        eachLine = eachLine.substring(eachLine.indexOf(" "));
        for (String AttrVal: eachLine.split(CharMatcher.WHITESPACE.toString())) {
            System.out.println("AttrVal: " + AttrVal);
            String Attr = AttrVal.substring(0, AttrVal.indexOf("="));
            String Val = CharMatcher.is('"').trimFrom(AttrVal.substring(AttrVal.indexOf("=")));
            newTags.put(Attr, Val);             
        }           
        listOfTags.add(newTags);
        newTags.clear();
      }     
    return listOfTags;      
}

我给出的输入如下 -

<AssinaturaTax12110000 Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"/> <AssinaturaTax12110000 Tag="12110000" TaxName="PIS" TaxRate="0.65" TaxAmount="0.64"/> <AssinaturaTax12110000 Tag="12110000" TaxName="COFINS" TaxRate="3.00" TaxAmount="2.97"/>

第一个 for-each 循环应该分隔行,第二个 for-each 循环应该分隔每行中的 AVP。我在第二个 for-each 循环中使用 Guava 来识别空格。虽然第一个 for-each 循环按预期工作,但在第二个循环中,字符串拆分不起作用。我已经尝试使用正则表达式“”、“\\s+”和“\\s”,以及 Apache Commons StringUtils split 方法,但未能产生所需的输出。

存在 StringIndexOutOfBounds 异常,控制台输出如下 -

AttrVal: Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"

我哪里错了?

我发现您的代码存在一些问题:

  1. 您确实应该使用 Biffen 建议的 XML 解析器。它让生活变得更轻松并防止错误。
  2. 第二个 for-each 语句根据空白字符拆分。但是,字符串本身以空白字符开头(在我的计算机上:[ Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"])。在按空格拆分后,第一部分是一个空字符串,您尝试从中获取一个子字符串,这显然是不可能的。要解决此问题,只需使用:for (String AttrVal: eachLine.trim().split("[\s]+")) 而不是 for (String AttrVal: eachLine.split("[\s]+"))。 trim() 函数自动删除字符串开头和结尾的空白字符。
  3. 您将 HashMap 添加到 ArrayList,然后清除 HashMap。由于 ArrayList 保留对映射的引用,因此您最终会得到一个空 HashMap 的 ArrayList。为输入中的每一行构造一个新的 HashMap,或者使用以下构造函数创建您拥有的 HashMap 的副本:HashMap<String,String> copy = new HashMap(newTags);。然后将副本添加到 ArrayList。通过使用该构造函数,将复制 newTags 中的所有值,并且不会保留对 newTags 的引用,因此您可以对 newTags 做任何您想做的事情,例如清除它。