Добавление сопоставления тега xml в текстовый файл с помощью hashmap не работает
Привет я анализирую теги XML без использования парсера, просто с помощью StringUtils.substring, так как мне нужно только 2 значения тегов. После того, как я получу эти значения, я добавляю их в список, и с этими двумя списками я готовлю карту со значениями и ключами. Эту хеш-карту я хочу добавить в файл. Если значения уже существуют, нет необходимости добавлять еще добавить. Но я сталкиваюсь с ошибкой при добавлении его в Hash map и прохождении через hashmap, чтобы проверить, существуют ли ключ / значения hashmap в строке чтения программы чтения файлов.
public class CompName {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("xml/input1.xml");
ArrayList<String> email = new ArrayList<String>();
ArrayList<String> comp = new ArrayList<String>();
Map<ArrayList<String>,ArrayList<String>> compIdmap = new LinkedHashMap<ArrayList<String>,ArrayList<String>>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
br.readLine();
while(true){
String line =br.readLine();
//System.out.println("line "+line);
if(line == null) break;
if(line.contains("<CompanyName>"))
{
String compName = StringUtils.substringBetween(line, "<CompanyName>", "</CompanyName>"); //str =" middle "
System.out.println(compName);
comp.add(compName);
}
if(line.contains("<CorporateEmailAddress>"))
{
String emailId = StringUtils.substringBetween(line, "<CorporateEmailAddress>", "</CorporateEmailAddress>"); //str =" middle "
if(emailId == null || emailId.equals(""))
emailId = "unknown";
System.out.println(emailId);
email.add(emailId);
}
for(int i=0;i<email.size();i++)
{
compIdmap.put(email, comp);
}
}
System.out.println("mapping :"+compIdmap);
BufferedWriter br1 = new BufferedWriter(new FileWriter("xml/mapping.txt"));
Iterator it = compIdmap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
br1.write(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
входной XML-файл для проверки этих тегов, как показано ниже
<?xml version="1.0" encoding="UTF-8"?>
<!-- Data provided by Bloomberg LP. -->
<FileDump>
<Version>IBXML 1.3</Version>
<CompanyName>STANDARD CHARTERED B</CompanyName>
<EmailAddress>abc@gmail.com</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<CompanyName>STANDARD CHARTERED B</CompanyName>
<EmailAddress>abc@gmail.com</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<CompanyName>DBS BANK LIMITED HON</CompanyName>
<EmailAddress>nnn@bbg.com</EmailAddress>
<CorporateEmailAddress>nicholas@123.com</CorporateEmailAddress>
<CompanyName>DBS BANK LIMITED HON</CompanyName>
<EmailAddress>nnn@bbg.com</EmailAddress>
<CorporateEmailAddress>nicholas@123.com</CorporateEmailAddress>
<CompanyName>DBS BANK LIMITED HON</CompanyName>
<EmailAddress>nnn@bbg.com</EmailAddress>
<CorporateEmailAddress>nicholas@123.com</CorporateEmailAddress>
<CompanyName>DBS BANK (HONG KONG)</CompanyName>
<EmailAddress>www@bbg.com</EmailAddress>
<CorporateEmailAddress>WHEEL@123.com</CorporateEmailAddress>
<CompanyName>DBS BANK (HONG KONG)</CompanyName>
<EmailAddress>www@bbg.com</EmailAddress>
<CorporateEmailAddress>WHEEL@123.com</CorporateEmailAddress>
</FileDump>
Я ожидаю, что выходной файл mapping.txt должен быть
unknown STANDARD CHARTERED B
nicholas@123.com DBS BANK LIMITED HON
WHEEL@123.com DBS BANK (HONG KONG)
1 ответ
Есть несколько проблем с кодом, во-первых, вы определили ключ и значение для карты как ArrayList
, ключ просто не может быть списком массивов - он не имеет логического значения, и если вы хотите, чтобы значения были различны, используйте Set.
примечание: как я понимаю, электронная почта принадлежит одной компании, так почему бы не сопоставить один-к-одному??
и почему это должно быть LinkedHashMap
? Вы заботитесь о порядке вставки ключей?
Вот рабочее решение
public static void main(String[] args) throws IOException
{
File file = new File("xml/input1.xml");
// main data structure
// key - corporate email
// value - set of distinct companies
// (does this make sense? a corporate email belongs to one company, no?
Map<String, Set<String>> compIdmap = new HashMap<String, Set<String>>();
// making use of Java 7 try-with-resources to auto close the file after use
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line, compName = "", email = "";
while ((line = br.readLine()) != null) {
if (line.contains("<CompanyName>")) {
compName = StringUtils.substringBetween(line, "<CompanyName>", "</CompanyName>");
}
if (line.contains("<CorporateEmailAddress>")) {
email = StringUtils.substringBetween(line, "<CorporateEmailAddress>", "</CorporateEmailAddress>");
if (email == null || email.equals("")) email = "unknown";
Set<String> companiesSet = compIdmap.containsKey(email) ? compIdmap.get(email) : new HashSet<>();
companiesSet.add(compName);
compIdmap.put(email, companiesSet);
}
}
System.out.println("mapping :" + compIdmap);
BufferedWriter br1 = new BufferedWriter(new FileWriter("xml/mapping.txt"));
Iterator it = compIdmap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
br1.write(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
РЕДАКТИРОВАТЬ:
Вот решение, которое дает точный желаемый результат
public static void main(String[] args)
{
File file = new File("xml/input1.xml");
// contains email + " " + company
Set<String> emailAndCompanySet = new HashSet<>();
// making use of Java 7 try-with-resources to auto close the file after use
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line, compName = "", email = "";
while ((line = br.readLine()) != null) {
if (line.contains("<CompanyName>")) {
compName = StringUtils.substringBetween(line, "<CompanyName>", "</CompanyName>");
}
if (line.contains("<CorporateEmailAddress>")) {
email = StringUtils.substringBetween(line, "<CorporateEmailAddress>", "</CorporateEmailAddress>");
if (email == null || email.equals(""))
email = "unknown";
emailAndCompanySet.add(email + " " + compName);
}
}
System.out.println("mapping :" + emailAndCompanySet);
BufferedWriter br1 = new BufferedWriter(new FileWriter("xml/mapping.txt"));
for (String emailAndCompany : emailAndCompanySet) {
System.out.println(emailAndCompany);
br1.write(emailAndCompany);
}
} catch (Exception e) {
e.printStackTrace();
}
}