0

こんにちは、必要なタグ値は2つだけなので、パーサーを使用せずにStringUtils.substringを使用してxmlタグを解析しています。これらの値を取得したら、それをリストに追加します。これらの 2 つのリストを使用して、値とキーを使用してマップを準備しています。このハッシュ マップをファイルに追加します。値がすでに存在する場合は、追加する必要はありません。しかし、ハッシュマップに追加し、ハッシュマップをトラバースして、ファイルリーダーの読み取り行にハッシュマップのキー/値が存在するかどうかを確認する際にエラーに直面しています。

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)
4

1 に答える 1

0

コードにはいくつかの問題があります。1 つ目は、キーと値をマップに として定義したことですArrayList。キーを配列リストにすることはできません。論理的な意味はありません。値を区別したい場合は、Set を使用してください。
注: 私が理解しているように、メールは 1 つの会社に属しているので、1 対 1 でマッピングしてみませんか??
なぜそうでなければならないの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();
    }
}
于 2016-09-12T11:31:03.570 に答える