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


158

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

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


잘 정의 할 수 있습니까? 성능, API 품질, 다른 것?
Yishai

성능 및 사용 편의성 (예, API 품질)
Premraj

3
Java의 기본 구현을 사용하지 않는 특정 이유를 게시하지 않았습니다.
호버크라프트 가득한 뱀장어

vtd-xml은 성능 / 메모리 사용 및 사용 편의성을 위해 이길 것입니다.
vtd-xml-author 2019

답변:


213

실제로 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에서 누락 된 특히 유용한 기능을 갖춘 최신 타사 라이브러리가 있다고 생각하지 않으며 표준 라이브러리는 매우 잘 테스트되고 문서화되고 안정적이라는 일반적인 이점이 있습니다.


"Natix"가 바로 "편집"옵션입니다. 지금 나아 져야합니다.
키키와

4
@Kikiwa 예외 처리는이 게시물의 지점에서 가능한 한 많이 제거되었습니다. 무능한 복사-붙여 넣기 프로그래머가 목적을 이해하지 못하고 스 니펫을 복사하면 자격이있는 것을 얻습니다. 실제로 걱정하거나 관심이 없습니다. 내가 말할 것은 다른 옵션이 던질 수있는 예외를 문서화하기 위해 try / catch 블록을 제거하고 메서드 서명을 표시하면 흥미로운 정보를 유지하면서 공간을 절약 할 수 있다는 것입니다. 누군가 누군가 그렇게하고 싶다면 그냥 가십시오.
Voo

1
(동시에 다른 방법으로 추가 정보를 표시하지 않고 try / catch를 제거하는 편집을 거부합니다)
Voo

최신 버전에서는 JAXB가 더 이상 JDK에 포함되지 않는다고 생각합니다.
Slaw

11

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/


5

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

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


2
DOM은 W3C 표준입니다 ( w3.org/DOM ). 이 표준의 Java 구현에는 JAXP 표준 ( jcp.org/en/jsr/detail?id=206 ) 이 적용됩니다 . 등 오라클, 아파치, : JAXP는 다음과 같은 서로 다른 공급자에 의해 구현됩니다
bdoughan

실제로, DOM이 그렇지 않다면 DOM을 전혀 사용하지 않을 것입니다. 다른 모든 관점에서 JDOM2 및 XOM이 훨씬 바람직합니다.
마이클 케이

4

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

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


어느 것을 선택하고 왜?
Premraj

1
그다지 중요하지 않습니다. 둘 다 JDK에 내장 된 SAX 및 DOM 파서의 래퍼입니다. W3C 문서 계층 구조는 장황하고 사용하기 어렵 기 때문에 DOM4J와 JDOM 모두 더 쉽게 만들려고합니다. Elliott Rusty Harold를 좋아하므로 JDOM에 먼저 도달하는 경향이 있습니다.
duffymo

4

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



1

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

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


3
경고 : VTD-XML VPL은 GPL에 따라 라이센스가 부여되어 대부분의 전문 또는 상업 개발 상황에서 효과적으로 배제됩니다. 엔지니어는 분석을 위해 자신의 변호사와상의해야하지만, 엔지니어링 비용을 지불하면 GPL에 따라 라이센스가 부여 된 라이브러리의 사용을 허용하지 않을 수 있습니다.
Sarah G

그 링크는 죽었다
null
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.