Java 如何从列表中删除换行符<;字符串>;

Java 如何从列表中删除换行符<;字符串>;,java,regex,xml,data-structures,stax,Java,Regex,Xml,Data Structures,Stax,我有一个方法,它从XML文件返回一个映射。我已将该映射转换为将键和值分隔到列表中 但是我注意到在值列表中有换行符。我怎样才能去掉换行符并用空格替换它们,或者让它们保持空白 代码: 任何帮助都将不胜感激。提前谢谢 编辑: XML文件 <Return xmlns="http://www.irs.gov/efile"> <ReturnData> <IRS1095A uuid="a77f40a2-af31-4404-a27d-4c1eaad730c2">

我有一个方法,它从XML文件返回一个映射。我已将该映射转换为将键和值分隔到列表中

但是我注意到在值列表中有换行符。我怎样才能去掉换行符并用空格替换它们,或者让它们保持空白

代码:

任何帮助都将不胜感激。提前谢谢

编辑:

XML文件

<Return xmlns="http://www.irs.gov/efile">
  <ReturnData>
    <IRS1095A uuid="a77f40a2-af31-4404-a27d-4c1eaad730c2">
      <MonthlyPTCInformationGrpPP uuid="69dc9dd5-5415-4ee4-a199-19b2dbb701be">
        <MonthlyPlanPremiumAmtPP>136</MonthlyPlanPremiumAmtPP>
        <MonthlyAdvancedPTCAmtPP>125</MonthlyAdvancedPTCAmtPP>
        <MonthCdPP>SEPTEMBER</MonthCdPP>
        <MonthlyPremiumSLCSPAmtPP>250</MonthlyPremiumSLCSPAmtPP>
      </MonthlyPTCInformationGrpPP>
    </IRS1095A>
    <IRS1040>
      <IndividualReturnFilingStatusCd>1</IndividualReturnFilingStatusCd>
      <WagesSalariesAndTipsAmt>22000</WagesSalariesAndTipsAmt>
      <TotalExemptionsCnt>1</TotalExemptionsCnt>
      <AdjustedGrossIncomeAmt>22000</AdjustedGrossIncomeAmt>
    </IRS1040>
  </ReturnData>
  <ReturnHeader>
    <SelfSelectPINGrp>
      <PrimaryBirthDt>1970-01-01</PrimaryBirthDt>
    </SelfSelectPINGrp>
    <Filer>
      <PrimarySSN>555-11-2222</PrimarySSN>
      <PrimaryResidentStatesInfoGrpPP>
        <ResidentStateInfoPP uuid="a77f40a2-af31-4404-a27d-4c1eaad730c2">
          <ResidentStateAbbreviationCdPP>CA</ResidentStateAbbreviationCdPP>
        </ResidentStateInfoPP>
      </PrimaryResidentStatesInfoGrpPP>
    </Filer>
  </ReturnHeader>
</Return>

136
125
九月
250
1.
22000
1.
22000
1970-01-01
555-11-2222
加利福尼亚州

设置
value=xr.getText().trim()
。这将从值的开头和结尾修剪无关字符


为了防止添加值,请使用if(value!=null&&!value.isEmpty())将
map.put(name,value)
包装成
if(value!=null&&!value.isEmpty())
设置
value=xr.getText().trim()
。这将从值的开头和结尾修剪无关字符


为了防止添加值,请使用if(value!=null&&!value.isEmpty())将
map.put(name,value)
包装成
if(value!=null&&!value.isEmpty())
设置
value=xr.getText().trim()
。这将从值的开头和结尾修剪无关字符


为了防止添加值,请使用if(value!=null&&!value.isEmpty())将
map.put(name,value)
包装成
if(value!=null&&!value.isEmpty())
设置
value=xr.getText().trim()
。这将从值的开头和结尾修剪无关字符


为了防止添加值,请使用
if(value!=null&&!value.isEmpty())将
map.put(name,value)
包装起来。

您的代码正在提取元素名和紧跟在开始元素之后的文本,忽略结束元素之后的任何文本

因此,它收集:

Return = <newline><space><space>
ReturnData = <newline><space><space><space><space>
IRS1095A = <newline><space><space><space><space><space><space>
MonthlyPTCInformationGrpPP = <newline><space><space><space><space><space><space><space><space>
MonthlyPlanPremiumAmtPP = 136
...
返回=
返回数据=
IRS1095A=
月加密信息GRPPP=
月计划费用IUMAMTPP=136
...
然后将它们添加到HashMap中,该HashMap以随机顺序洗牌键/值对,从而很难看到发生了什么

已更新

我不会为您编写代码,但如果您想要“值元素”,则需要:

  • 看到时记得开始元素吗
  • 收集任何文本,与已收集的其他文本连接,例如,当您看到
  • 当看到一个开始元素并记住一个开始元素时,验证文本是否为空或全部为空白,然后丢弃文本
  • 查看结束元素时:
  • 若记住了起始元素,则将elementName/text添加到结果中,然后忘记起始元素并放弃文本。注意:如果同一元素名称可以出现多次,则不要使用map
  • 若未记住起始元素(已被忽略),请验证文本是否为空或全部为空白,然后丢弃文本
  • 这将只收集叶元素,忽略任何“布局”

    代码与上面写的完全相同

    嗯,我确实添加了丢失的资源清理

    Map<String, String> map = new HashMap<>();
    try (FileInputStream in = new FileInputStream(file)) {
        XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(in);
        try (
            String elementName = null;
            StringBuilder textBuf = new StringBuilder();
            while (xr.hasNext()) {
                switch (xr.next()) {
                    case XMLStreamConstants.START_ELEMENT:
                        // 3. When seeing a start element and a start element is remembered
                        if (elementName != null) {
                            // verify text is empty or all whitespace
                            if (! textBuf.toString().trim().isEmpty())
                                throw new IllegalArgumentException("Found text mixed with elements");
                            // then discard text
                            textBuf.setLength(0);
                        }
                        // 1. Remember start element when seen
                        elementName = xr.getLocalName();
                        break;
                    case XMLStreamConstants.CHARACTERS:
                    case XMLStreamConstants.CDATA:
                    case XMLStreamConstants.SPACE:
                        // 2. Collect any text
                        textBuf.append(xr.getText());
                        break;
                    case XMLStreamConstants.END_ELEMENT: // 4. When seeing an end element
                        if (elementName != null) { // 1. if start element is remembered
                            // add elementName/text to result
                            map.put(elementName, textBuf.toString());
                            // then forget start element
                            elementName = null;
                            // and discard text
                            textBuf.setLength(0);
                        } else { // 2. if start element is not remembered (was forgotton)
                            // verify text is empty or all whitespace
                            if (! textBuf.toString().trim().isEmpty())
                                throw new IllegalArgumentException("Found text mixed with elements");
                            // then discard text
                            textBuf.setLength(0);
                        }
                        break;
                    default:
                        // ignore
                } 
            }
        } finally {
            xr.close();
        }
    }
    return map;
    
    Map Map=newhashmap();
    try(FileInputStream in=newfileinputstream(文件)){
    XMLStreamReader xr=XMLInputFactory.newInstance().createXMLStreamReader(in);
    试一试(
    字符串elementName=null;
    StringBuilder textBuf=新的StringBuilder();
    而(xr.hasNext()){
    开关(xr.next()){
    案例XMLStreamConstants.START_元素:
    //3.当看到起始元素时,会记住起始元素
    if(elementName!=null){
    //验证文本是否为空或全部为空白
    如果(!textBuf.toString().trim().isEmpty())
    抛出新的IllegalArgumentException(“找到了与元素混合的文本”);
    //然后丢弃文本
    textBuf.setLength(0);
    }
    //1.看到时记住开始元素
    elementName=xr.getLocalName();
    打破
    大小写XMLStreamConstants.CHARACTERS:
    案例XMLStreamConstants.CDATA:
    案例XMLStreamConstants.SPACE:
    //2.收集任何文本
    textBuf.append(xr.getText());
    打破
    案例XMLStreamConstants.END_ELEMENT://4。当看到一个END元素时
    if(elementName!=null){//1.如果开始元素被记住
    //向结果中添加元素名称/文本
    put(elementName,textBuf.toString());
    //然后忘记开始元素
    elementName=null;
    //并丢弃文本
    textBuf.setLength(0);
    }else{//2.如果未记住起始元素(已被忽略)
    //验证文本是否为空或全部为空白
    如果(!textBuf.toString().trim().isEmpty())
    抛出新的IllegalArgumentException(“找到了与元素混合的文本”);
    //然后丢弃文本
    textBuf.setLength(0);
    }
    打破
    违约:
    //忽略
    } 
    }
    }最后{
    xr.close();
    }
    }
    返回图;
    
    您的代码正在提取元素名称和紧跟在开始元素之后的文本,而忽略结束元素之后的任何文本

    因此,它收集:

    Return = <newline><space><space>
    ReturnData = <newline><space><space><space><space>
    IRS1095A = <newline><space><space><space><space><space><space>
    MonthlyPTCInformationGrpPP = <newline><space><space><space><space><space><space><space><space>
    MonthlyPlanPremiumAmtPP = 136
    ...
    
    返回=
    返回数据=
    IRS1095A=
    月加密信息GRPPP=
    月计划费用IUMAMTPP=136
    ...
    
    然后将它们添加到HashMap中,该HashMap以随机顺序洗牌键/值对,从而很难看到发生了什么

    已更新

    我不打算为你写代码
    Map<String, String> map = new HashMap<>();
    try (FileInputStream in = new FileInputStream(file)) {
        XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(in);
        try (
            String elementName = null;
            StringBuilder textBuf = new StringBuilder();
            while (xr.hasNext()) {
                switch (xr.next()) {
                    case XMLStreamConstants.START_ELEMENT:
                        // 3. When seeing a start element and a start element is remembered
                        if (elementName != null) {
                            // verify text is empty or all whitespace
                            if (! textBuf.toString().trim().isEmpty())
                                throw new IllegalArgumentException("Found text mixed with elements");
                            // then discard text
                            textBuf.setLength(0);
                        }
                        // 1. Remember start element when seen
                        elementName = xr.getLocalName();
                        break;
                    case XMLStreamConstants.CHARACTERS:
                    case XMLStreamConstants.CDATA:
                    case XMLStreamConstants.SPACE:
                        // 2. Collect any text
                        textBuf.append(xr.getText());
                        break;
                    case XMLStreamConstants.END_ELEMENT: // 4. When seeing an end element
                        if (elementName != null) { // 1. if start element is remembered
                            // add elementName/text to result
                            map.put(elementName, textBuf.toString());
                            // then forget start element
                            elementName = null;
                            // and discard text
                            textBuf.setLength(0);
                        } else { // 2. if start element is not remembered (was forgotton)
                            // verify text is empty or all whitespace
                            if (! textBuf.toString().trim().isEmpty())
                                throw new IllegalArgumentException("Found text mixed with elements");
                            // then discard text
                            textBuf.setLength(0);
                        }
                        break;
                    default:
                        // ignore
                } 
            }
        } finally {
            xr.close();
        }
    }
    return map;