>백엔드 개발 >XML/RSS 튜토리얼 >XML - XML ​​구문 분석을 위한 DOM4J

XML - XML ​​구문 분석을 위한 DOM4J

黄舟
黄舟원래의
2017-02-24 15:14:511528검색


애초에 Dom4j가 왜 있는 걸까요?

DOM은 너무 많은 메모리를 소비하고 SAX는 XML을 읽을 수만 있고 추가, 삭제 등은 할 수 없기 때문입니다. 그래서 더 효율적이고 거친 작업도 수행할 수 있는 Dom4j가 등장했습니다.

1. DOM4J 소개

  • Dom4j는 간단하고 유연한 오픈 소스 라이브러리입니다. Dom4j는 JDOM의 초기 개발자로부터 분리되어 독립적으로 개발되었습니다. JDOM과 달리 dom4j는 인터페이스와 추상 기본 클래스를 사용합니다. Dom4j의 API는 상대적으로 복잡하지만 JDOM보다 더 나은 유연성을 제공합니다.

  • Dom4j는 뛰어난 성능, 강력한 기능 및 사용하기 매우 쉬운 매우 뛰어난 Java XML API입니다. 현재 많은 소프트웨어는 Dom4j를 사용하는 Sun 자체 JAXP를 포함하여 Hibernate와 같은 Dom4j를 사용합니다.

  • Dom4j를 사용하여 개발하려면 dom4j의 해당 jar 파일을 다운로드하여 프로젝트로 가져와야 합니다. 다운로드 주소 dom4j 다운로드

2.DOM4J 케이스

아직 이전 XML 파일을 사용하고 있습니다:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>

이 문서는 com.dom4j.test 패키지에 있습니다.

DOM4J를 사용하려면 전체 문서를 나타내는 Document 객체도 얻어야 하지만 이 Document 객체는 org.dom4j 패키지에 있습니다.

다음과 같이 메인 메소드에서 Document 객체를 얻습니다:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));

그런 다음 필요에 따라 해당 메소드를 작성하고 이를 메인 메소드에서 호출할 수 있습니다.

【1】요소 읽기 지정(첫 번째 학생 정보 읽기)

public static void read(Document document) {    // 得到根元素
    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素
    // root.element("学生"):表示取出root下的第一个学生元素
    Element student = root.element("学生");    // 取出属性
    String address = student.attributeValue("地址");    // 取出各个子节点的值
    String name = student.element("名字").getText();
    String age = student.element("年龄").getText();
    String intro = student.element("介绍").getText();

    System.out.println(address);
    System.out.println(name);
    System.out.println(age);
    System.out.println(intro);
}

【2】요소 추가: 학생 정보 추가 XML 문서에

public static void add(Document document) throws Exception {    // 首先我们来创建一个学生节点对象
    Element student = DocumentHelper.createElement("学生");
    Element name = DocumentHelper.createElement("名字");
    name.setText("小强");
    Element age = DocumentHelper.createElement("年龄");
    age.setText("22");
    Element intro = DocumentHelper.createElement("介绍");
    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下
    student.add(name);
    student.add(age);
    student.add(intro);    // 为学生添加属性
    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下
    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}

XML 문서에 학생을 추가하려면 마지막에 메모리에 있는 Document 개체를 해당 파일에 써야 합니다. 그렇지 않으면 모든 작업은 해당 파일에서만 수행됩니다. memory 이며 DOM과 유사한 파일로 출력되지 않습니다.
이 업데이트된 코드를 다음과 같이 별도의 메소드로 작성할 수 있습니다.

public static void update(Document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}

[3] 지정된 위치에 요소 추가

public static void addByIndex(Document document) throws Exception {    // 创建一个元素
    Element newStu = DocumentHelper.createElement("学生");
    newStu.setText("王小明");    // 得到所有学生的list
    List allStudent = document.getRootElement().elements("学生");
    allStudent.add(1, newStu);
    update(document);
}

여기서 실제로 얻은 List에 직접 추가한 후 업데이트할 수 있습니다. 여기서 Listjava.util 패키지의 List


입니다. [4] 요소를 삭제하거나 이 요소의 속성을 삭제합니다.
요소 삭제 및 DOM 마찬가지로 해당 상위 노드를 통해 노드가 삭제됩니다. 예를 들어 첫 번째 학생 노드를 삭제하려고 합니다.

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}

[5] 업데이트 요소
예를 들어 모든 학생의 나이에 1을 추가하려고 합니다. , 모든 학생의 나이에 1을 추가합니다. 주소 속성을 미국으로 변경합니다.

public static void updateAgeAndAddress(Document document) throws Exception {
Element root = document.getRootElement();
    List<Element> list = root.elements();    for (Element element : list) {        // 更新属性
        element.addAttribute("地址", "美国");        // 更新年龄子节点的值
        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());
        e_age.setText(String.valueOf(age + 1));
    }
    update(document);
}

애초에 Dom4j가 있는 이유는 무엇입니까?

DOM은 너무 많은 메모리를 소비하고 SAX는 XML을 읽을 수만 있고 추가, 삭제 등은 할 수 없기 때문입니다. 그래서 더 효율적이고 거친 작업도 수행할 수 있는 Dom4j가 등장했습니다.

1. DOM4J 소개

  • Dom4j는 간단하고 유연한 오픈 소스 라이브러리입니다. Dom4j는 JDOM의 초기 개발자로부터 분리되어 독립적으로 개발되었습니다. JDOM과 달리 dom4j는 인터페이스와 추상 기본 클래스를 사용합니다. Dom4j의 API는 상대적으로 복잡하지만 JDOM보다 더 나은 유연성을 제공합니다.

  • Dom4j는 뛰어난 성능, 강력한 기능 및 사용하기 매우 쉬운 매우 뛰어난 Java XML API입니다. 현재 많은 소프트웨어는 Dom4j를 사용하는 Sun 자체 JAXP를 포함하여 Hibernate와 같은 Dom4j를 사용합니다.

  • Dom4j를 사용하여 개발하려면 dom4j의 해당 jar 파일을 다운로드하여 프로젝트로 가져와야 합니다. 다운로드 주소 dom4j 다운로드

2.DOM4J 케이스

아직 이전 XML 파일을 사용하고 있습니다:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>

이 문서는 com.dom4j.test 패키지에 있습니다.

DOM4J를 사용하려면 전체 문서를 나타내는 Document 객체도 얻어야 하지만 이 Document 객체는 org.dom4j 패키지에 있습니다.

다음과 같이 메인 메소드에서 Document 객체를 얻습니다:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));

그런 다음 필요에 따라 해당 메소드를 작성하고 이를 메인 메소드에서 호출할 수 있습니다.

【1】요소 읽기 지정(첫 번째 학생 정보 읽기)

public static void read(Document document) {    // 得到根元素
    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素
    // root.element("学生"):表示取出root下的第一个学生元素
    Element student = root.element("学生");    // 取出属性
    String address = student.attributeValue("地址");    // 取出各个子节点的值
    String name = student.element("名字").getText();
    String age = student.element("年龄").getText();
    String intro = student.element("介绍").getText();

    System.out.println(address);
    System.out.println(name);
    System.out.println(age);
    System.out.println(intro);
}

【2】요소 추가: 학생 정보 추가 XML 문서에

public static void add(Document document) throws Exception {    // 首先我们来创建一个学生节点对象
    Element student = DocumentHelper.createElement("学生");
    Element name = DocumentHelper.createElement("名字");
    name.setText("小强");
    Element age = DocumentHelper.createElement("年龄");
    age.setText("22");
    Element intro = DocumentHelper.createElement("介绍");
    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下
    student.add(name);
    student.add(age);
    student.add(intro);    // 为学生添加属性
    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下
    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}

XML 문서에 학생을 추가하려면 마지막에 메모리에 있는 Document 개체를 해당 파일에 써야 합니다. 그렇지 않으면 모든 작업은 해당 파일에서만 수행됩니다. memory 이며 DOM과 유사한 파일로 출력되지 않습니다.
이 업데이트된 코드를 다음과 같이 별도의 메소드로 작성할 수 있습니다.

public static void update(Document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}

[3] 지정된 위치에 요소 추가

public static void addByIndex(Document document) throws Exception {    // 创建一个元素
    Element newStu = DocumentHelper.createElement("学生");
    newStu.setText("王小明");    // 得到所有学生的list
    List allStudent = document.getRootElement().elements("学生");
    allStudent.add(1, newStu);
    update(document);
}

여기서 실제로 얻은 List에 직접 추가한 후 업데이트할 수 있습니다. 여기서 Listjava.util 패키지의 List


입니다. [4] 요소를 삭제하거나 이 요소의 속성을 삭제합니다.
요소 삭제 및 DOM 마찬가지로 해당 상위 노드를 통해 노드가 삭제됩니다. 예를 들어 첫 번째 학생 노드를 삭제하려고 합니다.

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}

[5] 업데이트 요소
예를 들어 모든 학생의 나이에 1을 추가하려고 합니다. , 모든 학생의 나이에 1을 추가합니다. 주소 속성을 미국으로 변경합니다.

public static void updateAgeAndAddress(Document document) throws Exception {
Element root = document.getRootElement();
    List<Element> list = root.elements();    for (Element element : list) {        // 更新属性
        element.addAttribute("地址", "美国");        // 更新年龄子节点的值
        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());
        e_age.setText(String.valueOf(age + 1));
    }
    update(document);
}

 以上就是XML—XML解析之DOM4J的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.