[java] 자바에서 XML 파싱을위한 최고의 라이브러리는 무엇입니까?

XML (복잡한 구성 및 데이터 파일) 구문 분석을 위해 Java 라이브러리를 검색하고 있지만 조금 봤지만 dom4j 이외의 다른 것을 찾을 수 없었습니다 (V2에서 작업하는 것처럼 보입니다). 공통 구성을 살펴 보았지만 마음에 들지 않으면, XML에 대한 다른 아파치 프로젝트는 최대 절전 모드에있는 것 같습니다. 나는 스스로 dom4j를 평가하지 않았지만 알고 싶었습니다. 자바에는 다른 (좋은) 오픈 소스 XML 파싱 라이브러리가 있습니까? dom4j 사용 경험은 어떻습니까?

@Voo의 대답 후에 또 다른 질문을하겠습니다. Java의 내장 클래스 또는 dom4j와 같은 타사 라이브러리를 사용해야합니까? 장점은 무엇입니까?



답변

실제로 Java는 4 가지 방법으로 XML을 즉시 구문 분석 할 수 있습니다.

DOM 파서 / 빌더 : 전체 XML 구조가 메모리에로드되고 잘 알려진 DOM 메소드를 사용하여 작업 할 수 있습니다. DOM을 사용하면 Xslt 변환을 사용하여 문서에 쓸 수도 있습니다. 예:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAX 파서 : XML 문서를 읽기만하면됩니다. Sax 파서는 문서를 통해 실행되고 사용자의 콜백 메소드를 호출합니다. 문서, 요소 등을 시작 / 종료하는 방법이 있습니다. 그것들은 org.xml.sax.ContentHandler에 정의되어 있으며 빈 헬퍼 클래스 DefaultHandler가 있습니다.

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAx Reader / Writer : 데이터 스트림 지향 인터페이스에서 작동합니다. 프로그램은 커서 / 반복자와 같이 준비가되면 다음 요소를 요청합니다. 문서를 만들 수도 있습니다. 문서를 읽으십시오 :

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

문서 작성 :

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB : XML 문서를 읽는 최신 구현 : v2에서 Java 6의 일부입니다. 이를 통해 문서에서 Java 객체를 직렬화 할 수 있습니다. javax.xml.bind.Unmarshaller에 대한 인터페이스를 구현하는 클래스를 사용하여 문서를 읽습니다 (JAXBContext.newInstance에서 클래스를 얻습니다). 컨텍스트는 사용 된 클래스로 초기화되어야하지만 루트 클래스를 지정하기 만하면되고 정적 참조 클래스에 대해 걱정할 필요가 없습니다. 주석을 사용하여 어떤 클래스가 요소 (@XmlRootElement) 여야하고 어떤 필드가 요소 (@XmlElement) 또는 속성 (@XmlAttribute)인지 지정해야합니다.

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

문서 작성 :

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

예전 강의 슬라이드에서 뻔뻔스럽게 복사 한 예 😉

편집 : “어떤 API를 사용해야합니까?” 글쎄요-모든 API가 당신이 보는 것과 동일한 기능을 가지고 있지는 않지만 XML 문서를 매핑하는 데 사용하는 클래스를 제어 할 수 있다면 JAXB는 개인적으로 가장 좋아하는 매우 우아하고 간단한 솔루션입니다. 정말 큰 문서라면 약간 복잡해질 수 있습니다). SAX는 꽤 사용하기 쉽고 DOM을 사용하지 않을 이유가 없다면 DOM에서 멀리 떨어져 있습니다. 제 생각에는 오래되고 어색한 API입니다. STL에서 누락 된 특히 유용한 기능을 갖춘 최신 타사 라이브러리가 있다고 생각하지 않으며 표준 라이브러리는 매우 잘 테스트되고 문서화되고 안정적이라는 일반적인 이점이 있습니다.


답변

Java는 기본적으로 XML 구문 분석을위한 두 가지 방법을 지원합니다.

SAXParser

큰 XML 파일을 구문 분석하거나 많은 메모리를 사용하지 않으려는 경우이 구문 분석기를 사용할 수 있습니다.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

예 : http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

XPath 조회를 수행해야하거나 완전한 DOM을 사용할 수 있어야하는 경우이 구문 분석기를 사용할 수 있습니다.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

예 : http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/


답변

DOM과 같은 API, 즉 XML 파서가 문서를 요소 및 속성 노드 트리로 변환하는 DOM과 같은 API를 원한다면 DOM 자체, JDOM, DOM4J 및 XOM 중에서 4 가지 중에서 선택할 수 있습니다. DOM을 사용하는 유일한 이유는 표준으로 인식되어 JDK에서 제공되기 때문입니다. 다른 모든 측면에서 다른 모든 것이 우수합니다. 단순성, 성능 및 성능의 조합을 선호하는 것은 XOM입니다.

물론 저급 파서 인터페이스 (SAX 및 StAX), 데이터 객체 바인딩 인터페이스 (JAXB) 및 고급 선언 언어 (XSLT, XQuery, XPath)와 같은 다른 처리 스타일도 있습니다. 당신에게 가장 적합한 것은 프로젝트 요구 사항과 개인적인 취향에 달려 있습니다.


답변

Nikita의 요점은 훌륭한 것입니다. 성숙과 나쁜 것을 혼동하지 마십시오. XML은 많이 바뀌지 않았습니다.

JDOM은 DOM4J의 또 다른 대안입니다.


답변

Java에서 XML을 구문 분석하기 위해 외부 라이브러리가 필요하지 않습니다. Java에는 SAX 및 DOM을위한 내장 구현이 포함되어 있습니다.


답변

JDOM 사용에 관심이 있지만 한동안 업데이트되지 않은 (특히 Java 제네릭을 활용하지 않는) 사람들을 위해 CoffeeDOM이라는 포크가 있으며 이러한 측면을 정확하게 해결하고 JDOM API를 현대화합니다.

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

프로젝트 페이지에서 다운로드하십시오.

https://github.com/cdmckay/coffeedom


답변

VTD-XML은 강력한 XML 구문 분석 라이브러리입니다. 사실상 모든면에서 다른 방식보다 낫습니다 … 여기에 Java 플랫폼에서 사용할 수있는 모든 XML 처리 프레임 워크를 분석하는 2013 백서가 있습니다 …

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf