azerphoenix
@azerphoenix
Java Software Engineer

Как объединить xml по id средствами Java?

Добрый день!
Пытаюсь спарсить данные из xml файла средствами Java. Проблема заключается в том, что в xml файле id могут совпадать и нужно объединить совпадающие id и соответственно все внутренние теги. Поиск в сети дает результаты на объединение 2-х файлов, но не ID внутри одного файла... Или может стоит объединять данные уже после парсинга оперируя объектами?

<database>
    <table id="2638">
        <post_title>bla-bla</post_title>
        <drivers>bla-bla</drivers>
        <drivers_value>bla-bla</drivers_value>
    </table>
    <table id="2638">
        <post_title>bla-bla</post_title>
        <packaging>bla-bla</packaging>
        <packaging_value>bla-bla</packaging_value>
    </table>
    <table id="2638">
        <post_title>bla-bla</post_title>
        <storage>bla-bla</storage>
        <storage_value>bla-bla</storage_value>
    </table>
    <table id="2638">
        <post_title>bla-bla</post_title>
        <expdate>bla-bla</expdate>
        <expdate_value>bla-bla</expdate_value>
    </table>
</database>


Java код, который я использую:

Java code
public class ParseData {

    public static void main(String[] args) {

        // парсим данные
        parseData();
        
    }

    private static void parseData () {
        // Название файла
        File file = new File("xz.xml");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(file);
            NodeList tableList = doc.getElementsByTagName("table");

            List<Drug> drugList;drugList = new ArrayList<>();

            // Цикл
            for(int i = 0; i<tableList.getLength(); i++) {
                Node tb = tableList.item(i);

                Drug drug = new Drug();
                if(tb.getNodeType()==Node.ELEMENT_NODE) {

                    Element table = (Element) tb;


                    drug.setID(Integer.valueOf(table.getAttribute("id")));

                    NodeList dataList = table.getChildNodes();
                    for (int j = 0; j<dataList.getLength(); j++) {
                        Node n = dataList.item(j);

                        if(n.getNodeType()==Node.ELEMENT_NODE) {
                            Element childElement = (Element) n;

                            switch (childElement.getNodeName()) {
                                case "ID": {
                                    drug.setID(Integer.valueOf(childElement.getTextContent()));
                                } break;
                                case "post_title": {
                                    drug.setPost_title(childElement.getTextContent());
                                } break;
                                case "tradename": {
                                    drug.setTradename(childElement.getTextContent());
                                } break;
                                case "inname": {
                                    drug.setInname(childElement.getTextContent());
                                } 
                                // код обрезан

                            }
                        }
                    } // внутренний цикл for

                    drugList.add(drug);

                }

            } // внешний цикл for
            drugList.forEach(System.out::println);
            System.out.println(drugList.size());

            /* Здесь начинается добавление в лист */

            Workbook wb = new XSSFWorkbook();
            Sheet sheet = wb.createSheet("Препараты");


            Map<String, Object[]> data = new TreeMap<String, Object[]>();
            data.put("1", new Object[] {"ID", "tradename","inname","atx","storage",
                    "expdate", "pharmcondition", "drivers"," packaging","manufacter",
                    "dosing", "sideeffect", "special", "pregnantuse","kids",
                    "oldman", "interaction", "overdose","pharmeffect",
                    "pharmacokinetics","pharmacodynamics"," indications",
                    "contraindications","dosageform", "composition", "description", "pharmgroup"});

            for (int m=0; m<drugList.size(); m++) {
                data.put(String.valueOf(m), new Object[]{drugList.get(m).getID(), drugList.get(m).getTradename_value(),
                        drugList.get(m).getInname_value(), drugList.get(m).getAtx_value(),
                        drugList.get(m).getStorage_value(), drugList.get(m).getExpdate_value(),
                        // код обрезан

            }

            Set<String> keySet = data.keySet();
            int rownum = 0;
            for (String key : keySet) {
                Row row = sheet.createRow(rownum++);
                Object[] objArr = data.get(key);
                int cellNum = 0;
                for (Object obj : objArr) {
                    Cell cell = row.createCell(cellNum++);
                    if (obj instanceof String) {
                        cell.setCellValue((String) obj);
                    } else if (obj instanceof Integer) {
                        cell.setCellValue((Integer) obj);
                    }
                }
            }


            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream("outputx.xlsx");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                wb.write(fos);
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            /* Здесь заканчивается добавление в лист */

        } catch (ParserConfigurationException e) {
            e.printStackTrace();

        } catch (SAXException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();
        }

    }

}
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
al_gon
@al_gon
стоит объединять данные уже после парсинга оперируя объектами
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Soft-logic Барнаул
от 120 000 до 200 000 ₽
AISA IT-Service Санкт-Петербург
от 50 000 до 200 000 ₽
MediaSoft Санкт-Петербург
от 90 000 до 200 000 ₽