XML 파일 처리를 위한 Dom4j 활용

1. XML 생성 및 저장

public static void createAndSaveXml(String filePath) {
    try {
        Document doc = DocumentHelper.createDocument();
        Element rootElement = doc.addElement("Configuration");

        addPortElement(rootElement, "혈압", "COM30");
        addPortElement(rootElement, "체중", "COM32");
        addPortElement(rootElement, "혈당", "COM34");
        addPortElement(rootElement, "지방", "COM36");
        addPortElement(rootElement, "-UA-", "COM38");

        OutputFormat format = new OutputFormat("    ", true);
        XMLWriter writer = new XMLWriter(new FileWriter(filePath), format);
        writer.write(doc);
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void addPortElement(Element parent, String portName, String portNumber) {
    Element port = parent.addElement("Device");
    port.addAttribute("Name", portName);
    port.addAttribute("ID", portNumber);
}

위 코드는 DocumentHelper 클래스를 사용하여 새로운 XML 문서를 생성하고, 루트 엘리먼트 아래에 여러 하위 엘리먼트를 추가하는 예제입니다. 각각의 포트 정보는 addPortElement 메소드로 동적으로 추가되며, 마지막으로 XMLWriter를 통해 파일로 저장됩니다.

2. XML 읽기 및 분석

public static void readAndParseXml(String filePath) {
    try {
        SAXReader reader = new SAXReader();
        Document document = reader.read(filePath);

        Element root = document.getRootElement();
        for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext(); ) {
            Element device = iterator.next();
            String name = device.attributeValue("Name");
            String id = device.attributeValue("ID");

            if ("혈압".equals(name)) {
                Settings.portBloodPressure = id;
            } else if ("체중".equals(name)) {
                Settings.portWeight = id;
            } else if ("혈당".equals(name)) {
                Settings.portBloodSugar = id;
            } else if ("지방".equals(name)) {
                Settings.portFat = id;
            } else if ("-UA-".equals(name)) {
                Settings.portUricAcid = id;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

SAXReader를 이용해 XML 문서를 로드한 후, 루트 엘리먼트에서 하위 엘리먼트들을 반복적으로 검색합니다. 각 엘리먼트의 속성 값은 attributeValue() 메소드로 추출하며, 특정 이름에 따라 전역 변수에 값을 할당합니다.

3. XML 수정

public static void updateXml(String filePath) {
    try {
        File file = new File(filePath);
        SAXReader reader = new SAXReader();
        Document document = reader.read(file);

        Element root = document.getRootElement();
        for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext(); ) {
            Element device = iterator.next();
            String name = device.attributeValue("Name");

            if ("혈압".equals(name)) {
                device.setAttributeValue("ID", Settings.portBloodPressure);
            } else if ("체중".equals(name)) {
                device.setAttributeValue("ID", Settings.portWeight);
            } else if ("혈당".equals(name)) {
                device.setAttributeValue("ID", Settings.portBloodSugar);
            } else if ("지방".equals(name)) {
                device.setAttributeValue("ID", Settings.portFat);
            } else if ("-UA-".equals(name)) {
                device.setAttributeValue("ID", Settings.portUricAcid);
            }
        }

        XMLWriter writer = new XMLWriter(new FileWriter(file));
        writer.write(document);
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

이 메소드는 기존 XML 문서를 수정하기 위해 사용됩니다. 각 엘리먼트의 속성값을 변경한 후, 다시 XMLWriter를 통해 파일에 저장합니다.

XML 파일 구조:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Device Name="혈압" ID="COM30"/>
    <Device Name="체중" ID="COM32"/>
    <Device Name="혈당" ID="COM34"/>
    <Device Name="지방" ID="COM36"/>
    <Device Name="-UA-" ID="COM38"/>
</Configuration>

태그: dom4j XML saxreader

6월 8일 23:09에 게시됨