자바를위한 최고의 XML 파서


387

나는 작은 요소 (최대 8MB, UTF-8로 인코딩 됨) XML 파일을 읽고, 다양한 요소와 속성을 살펴보고, 일부를 수정하고 XML을 디스크에 다시 써야합니다 (바람직하게 들여 쓰기가 잘 된 형식으로) .

내 요구에 가장 적합한 XML 파서는 무엇입니까? 선택할 수있는 많은 것이 있습니다. 내가 알고있는 일부는 다음과 같습니다.

그리고 물론 JDK의 하나입니다 (Java 6을 사용하고 있습니다). Xerces에 익숙하지만 어색한 것을 발견했습니다.

추천?


6
: 난 당신이 여기에서 더 플레이어를 찾을 수 있습니다 생각 xml.com/lpt/a/1703
dma_k

1
이 질문에 실제 문제가 있다고 생각합니다. 1은 dom-manipulation 라이브러리 (dom4j, xom, jdom)와 함께 덩어리가있는 파서 (xerces, crimson)와 완전히 비교되는 것입니다. 또한 그 대답은 옹호하는 경향이 있으며 그렇게 건설적인 것은 아닙니다.
Nathan Hughes

51
건설적이지 않은 +220 분명히 중재자와 사용자는 건설적인 것에 대해 다른 관점을 가지고 있습니다.
tbroberg

5
예, 이와 같은 질문에 대해서는 모드가 근시안적 인 것 같습니다. 그렇습니다. 답변은 의견이 있지만 경험을 바탕으로하며 대부분의 경우 답변이 정량화됩니다. Mods는 토론을 위해 열려있는이 질문을 옮기기 위해 아마도 다른 태그를 만들어야합니다.이 질문은 건설적인 비판과 결과를 초래합니다.
Ashraff Ali Wahab

@dma_k 링크가 작동하지 않습니다.
gaurav

답변:


81

속도와 메모리에 문제가 없다면 dom4j 는 정말 좋은 옵션입니다. 속도가 필요한 경우 Woodstox 와 같은 StAX 파서를 사용하는 것이 올바른 방법이지만 더 많은 코드를 작성하여 작업을 완료해야하며 스트림에서 XML을 처리하는 데 익숙해 져야 합니다.


6
dom4j는 꽤 좋지만 확실히 문제는 없습니다. 좋은 dom4j 대안에 대해서는 stackoverflow.com/questions/831865/…
Jonik

@zehrer 스레드 안전합니까?
gaurav

257

특정 파서 구현을 고려해서는 안된다고 생각합니다. XML 처리를위한 Java API를 사용하면 적합한 구문 분석기 구현을 표준 방식으로 사용할 수 있습니다. 코드는 훨씬 이식성이 좋으며 특정 파서가 너무 오래되었다는 것을 알게되면 코드 줄을 변경하지 않고 다른 코드로 바꿀 수 있습니다 (올바르게 수행하는 경우).

기본적으로 표준 방식으로 XML을 처리하는 세 가지 방법이 있습니다.

  • SAX 가장 간단한 API입니다. XML이 직렬 방식으로 처리 될 때 요소 / 속성 내부의 데이터를 수신하는 핸들러 클래스를 정의하여 XML을 읽습니다. 일부 속성 / 요소 만 읽고 /하거나 일부 값을 다시 쓰려는 경우 더 빠르고 간단합니다 (귀하의 경우).
  • DOM 이 메소드는 임의로 수정 / 액세스 할 수있는 객체 트리를 생성하므로 복잡한 XML 조작 및 처리에 더 좋습니다.
  • StAX SAX와 DOM 사이의 중간에 있습니다. 처리 할 때 관심있는 파서에서 데이터를 가져 오는 코드 만 작성하면됩니다.

JDOM 또는 Apache API (예 : Apache Xerces XMLSerializer ) 와 같은 독점 API를 잊어 버리면 시간이 지남에 따라 또는 이전 버전과의 호환성을 잃을 수있는 특정 구현에 연결되므로 나중에 업그레이드하려는 경우 코드를 변경할 수 있습니다. JDOM의 새로운 버전 또는 사용하는 파서 팩토리와 인터페이스를 사용하는 Java 표준 API를 고수하면 코드를 훨씬 모듈화하고 유지 관리 할 수 ​​있습니다.

제안 된 파서의 모든 (모두 확인하지는 않았지만 거의 확실합니다)은 JAXP 구현을 준수하므로 기술적으로 모든 것을 사용할 수 있습니다.


11
실제로 3 가지 방법 : StAX (javax.xml.stream)가 세 번째 표준입니다.
StaxMan


@kitokid Chrome은 페이지에 불쾌한 내용이 있다고 말합니다. 나는 이것을 대신 사용했다 : sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

좋은 개요 : 내가 동의하지 않는 한 가지-증분 / 스트리밍의 경우 SAX 및 Stax는 표준 API로 충분하지만 DOM에는 해당되지 않습니다 (IMO) .Java 고유의 ​​이유는 다음과 같습니다. XOM, JDOM 및 DOM4J : 언어에 구애받지 않는 DOM은 사용하기가 번거 롭습니다.
StaxMan

130

다음은 DOM, SAX, StAX & TrAX에 대한 훌륭한 비교입니다 (출처 : http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

특징 SAX SAX DOM TrAX

API 유형                 풀, 스트리밍 푸시, 스트리밍 메모리 트리 XSLT 규칙

사용 편의성           높음 중간 높음 중간

XPath 기능    아니요 아니요 예 예

CPU 및 메모리     좋음 좋음 다름

전달 만        예 예 아니요 아니요

XML 읽기              예 예 예

XML 쓰기              예 아니요 예 예

CRUD                      아니요 아니요 예 아니요


7
SAX로 XML을 작성할 수 있습니다. 싱크는 사용자가 SAX 이벤트를 호출하여 XML 출력을 생성 할 수있는 핸들러 구현을 제공합니다. (테이블이 원본이 아닌 소스임을 알 수 있지만 테이블은 잘못되었습니다.)
Dev


4

SAX 및 DOM 외에도 XML 풀 파서 인 XMLStreamReader를 사용하여 STaX 파싱을 사용할 수 있습니다.



2

나는 이것이 당신이 당신의 앱에 많은 "생각"을 가지고 있다는 것을 권장하지는 않지만 XSLT를 사용하는 것이 Java 조작보다 더 좋을 수 있습니다 (XSLT-바이트 코드 컴파일의 경우 잠재적으로 더 빠를 수 있습니다).


3
더 나은, 가능한 : 더 빠르고, 매우 가능성이 낮습니다.
StaxMan

XML 읽기, 조작 및 쓰기는 정확히 XSLT가하는 일입니다. 이것은 즉시 사용 가능한 좋은 답변입니다.
james.garriss 14 1

1

성능에 관심이 없다면 Apache Digester의 열렬한 팬입니다. 본질적으로 XML에서 Java Beans로 직접 매핑 할 수 있기 때문입니다.

그렇지 않으면 먼저 구문 분석 한 다음 객체를 구성해야합니다.


Java Beans를 만들 필요가 없으며 원시 XML 요소를 약간 조작하고 특정 요소를 검토하여 데이터를 가져올 수 있으므로 DOM 스타일 파서는 아마도 이상적인 솔루션입니다.
Evan

예, 아마도 dom4j가 더 나은 솔루션 일 것입니다 ... 소화기로 한 단계 올라갈 때까지 많이 사용했습니다
Uri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.