2015-08-20 2 views
0

У меня есть метод, который возвращает мне карту из файла XML. Я преобразовал эту карту, чтобы отделить Ключи и Значения в Списке.Как удалить символы новой строки из списка <String>

Однако я замечаю, что в списке значений есть символы новой строки. Как я могу разделить новую строку и заменить их пробелом или оставить их пустыми.

Код:

@Test 
public void testGetXMLModelData() throws Exception { 
    File f = new File("xmlDir/example.xml"); 
    Model m = getXMLModelData(f); 

    logger.debug("Models Keys: "+m.getInputs()); 
    logger.debug("Models Values: "+m.getValues()); 
} 

public Model getXMLModelData(File f) throws Exception { 

    Model model = new Model(); 

    Map<String,String> map = p(f); 
    List<String> listKeys = new ArrayList<String>(map.keySet()); 
    List<String> listValues = new ArrayList<String>(map.values()); 

    model.setInputs(listKeys); 
    model.setValues(listValues); 

    return model; 
} 


public Map<String, String> p(File file) throws Exception { 

    Map<String, String> map = new HashMap<String,String>(); 
    XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(file)); 

    while(xr.hasNext()) { 

     int e = xr.next(); 
     if (e == XMLStreamReader.START_ELEMENT) { 
      String name = xr.getLocalName(); 
      xr.next(); 
      String value = null; 
      try { 
       value = xr.getText(); 
      } catch (IllegalStateException exep) { 
       exep.printStackTrace(); 
      } 
      map.put(name, value); 
     } 
    } 
    return map; 
} 

Выход:

2015-08-19 20:13:52,327 : Models Keys: [IRS1095A, MonthlyPlanPremiumAmtPP, WagesSalariesAndTipsAmt, MonthlyAdvancedPTCAmtPP, MonthCdPP, ReturnData, IndividualReturnFilingStatusCd, PrimaryResidentStatesInfoGrpPP, MonthlyPTCInformationGrpPP, IRS1040, ResidentStateInfoPP, SelfSelectPINGrp, MonthlyPremiumSLCSPAmtPP, Filer, ResidentStateAbbreviationCdPP, PrimaryBirthDt, Return, ReturnHeader, TotalExemptionsCnt, AdjustedGrossIncomeAmt, PrimarySSN] 
2015-08-19 20:13:52,328 : Models Values: [ 
     , 136, 22000, 125, SEPTEMBER, 
    , 1, 
     , 
     , 
     , 
      , 
     , 250, 
     , CA, 1970-01-01, 
    , 
    , 1, 22000, 555-11-2222] 

Любая помощь или помощь будет оценена. Заранее спасибо

Edit:

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> 
+0

Показать файл XML. – Andreas

+0

Я опубликовал XML-файл – mosawi

ответ

2

Set value = xr.getText().trim(). Это позволит обрезать посторонние символы от начала и до конца значений.

Чтобы затем предотвратить добавление значения, оберните map.put(name, value) с if (value != null && !value.isEmpty())

+0

Как получить только значения и не пустые значения, похоже, что разбор, который я делаю, - это получение каждым узлом даже корневых узлов без значений. – mosawi

+1

Оберните команду map.put() в инструкции if, где вы проверяете непустое значение. Я добавлю это к своему ответу. – BamaPookie

+0

Это было бы очень полезно, я с нетерпением жду вашего ответа. Спасибо. – mosawi

1

Ваш код извлекает имя элемента и текст сразу же после стартового элемента, игнорируя текст после конечного элемента.

Таким образом, он собирает:

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 
... 

А потом добавить их в HashMap, который тасует пар ключ/значение в произвольном порядке, что делает его трудно увидеть, что произошло.

Обновлено

Я не собираюсь писать код для вас, но если вы хотите «элементы стоимости», то вам необходимо:

  1. Помните начать элемент, если смотреть
  2. Собирайте любой текст, соединяясь с другим уже собранным текстом, например когда вы видите < текст> < CDATA> < текст>
  3. Когда видим начальный элемент и начальный элемент запоминается, проверьте текст пуст или все пробелы, а затем отбросить текст
  4. Когда видим конечный элемент:
    1. если элемент start запомнен, добавьте элементName/text в результат, затем запустите элемент start и отбросьте текст. Примечание. Не используйте карту, если одно и то же имя элемента может появляться более одного раза.
    2. если старт элемент не запоминается (был forgotton), проверьте текст пуст или все пробелы, а затем отбросить тексту

Это будет собирать только элементы листа, игнорируя «макет».

код точно как написано выше

Ну, я добавить недостающую очистку ресурсов.

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; 
+0

Да, вы в точности верны. Я не знал, как это сказать, но ты это сказал. Как я могу изменить его, чтобы просто собрать элементы со значениями? Я пробовал это уже около двух дней ... не повезло ... проблема в том, что я не уверен, как задать вопрос, но вы, кажется, очень хорошо понимаете. – mosawi

+0

Элементы со значениями? Что, если 'PrimarySSN' была пустой строкой? Вы все еще хотите этого? Знаете ли вы, что XML читает или должен обрабатывать ** любой ** XML-файл? – Andreas

+0

Да точно! Вы читаете мой разум! Он должен обрабатывать любой XML, поэтому структура документа неизвестна заранее! – mosawi

Смежные вопросы