다양한 XML 문서를 처리하기 위해 Java를 어떻게 사용 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/30627

  •  09-06-2019
  •  | 
  •  

문제

Java 애플리케이션을 사용하여 다양한 XML 문서를 구문 분석하는 가장 좋은 방법을 찾고 있습니다. 나는 현재 SAX와 사용자 정의 컨텐츠 핸들러로 이것을하고 있으며 훌륭하고 안정적입니다.

현재 단일 형식의 XML 문서를 받고 다양한 XML 요소가 변경된 두 가지 추가 XML 문서 형식을받는 동일한 프로그램을 갖는 옵션을 탐색하기로 결정했습니다. 문서의 첫 번째 "startElement"를 기반으로 ContentHandler를 적절한 것으로 바꾸고 싶었지만 ... 어-두, ContentHandler가 설정되고 그런 다음 문서가 구문 분석됩니다! 라코 디스

그래서 처음에 할 수 있다고 생각했던 방식으로 할 수있는 것 같지 않습니다.

그렇다면 내가 이걸 완전히 잘못보고있는 건가요? 동일한 XML 처리 코드로 여러 개의 개별 XML 문서를 구문 분석하는 가장 좋은 방법은 무엇입니까? 이전에 좀 더 일반적인 게시물에서 물어 보았습니다 .. .하지만 너무 모호하다고 생각합니다 . 이러한 XML 문서는 상당히 크고 시스템은 몇 분마다 약 1200 개를 수신하기 때문에 속도와 효율성을 위해 DOM을 실제로 살펴본 적이 없습니다. 정보를 보내는 한 가지 방법입니다.

이 질문을 너무 길게 만들고 혼란을 더합니다. 다음은 하나의 SAX, StAX 또는 ??를 갖고 싶은 다양한 XML 문서의 모형입니다. 파서는 깨끗하게 처리합니다.

products.xml : 라코 디스

stores.xml : 라코 디스

managers.xml : 라코 디스

도움이 되었습니까?

해결책

내가 이해하고 있듯이 문제는 파싱하기 전에 문서의 형식을 알지 못한다는 것입니다.대리자 패턴을 사용할 수 있습니다.DTD / XSD / etcetera에 대해 유효성을 검사하지 않고 DefaultHandler가 상태를 갖는 것이 좋다고 가정합니다. 라코 디스

다른 팁

하고 싶은 일을 잘 설명했지만 이유는 설명하지 않았습니다.XML로 /로부터 Java 객체를 마샬링 및 언 마샬링하는 몇 가지 XML 프레임 워크가 있습니다.

가장 간단한 방법은 구성 파일을 구문 분석하는 데 일반적으로 사용하는 Commons Digester 입니다.그러나 Java 객체를 처리하려면 Castor , JiBX , JAXB , XMLBeans , XStream 또는 이와 유사한 것.Castor 또는 JiBX는 제가 가장 좋아하는 두 가지 제품입니다.

SAXParser를 한 번 사용해 보았지만 XStream 을 찾은 후에는 다시 사용하지 않았습니다.XStream을 사용하여 Java 객체를 생성하고 XML로 변환 할 수 있습니다.그들을 보내고 XStream을 사용하여 개체를 다시 만듭니다.사용하기 쉽고 빠르며 깨끗한 XML을 만듭니다.

어느 쪽이든 XML 파일에서 수신 할 데이터를 알아야합니다.사용할 파서를 알기 위해 여러 가지 방법으로 보낼 수 있습니다.또는 모든 것을 저장할 수 있지만 하나의 구조 만 채워지는 데이터 개체 (제품 / 상점 / 관리자)가 있습니다.아마도 다음과 같습니다. 라코 디스

XStream을 사용하여 XML로 변환 한 다음 개체를 다시 만듭니다.그런 다음 원하는 작업을 수행하세요.

XMLReader.setContentHandler () , 내용 : <인용구>

애플리케이션은 구문 분석 중에 새 핸들러 또는 다른 핸들러를 등록 할 수 있으며 SAX 구문 분석기는 즉시 새 핸들러 사용을 시작해야합니다.

따라서 첫 번째 SelectorContentHandler 이벤트까지 이벤트를 소비하는 startElement를 생성 할 수 있어야합니다.이를 기반으로 XML 리더에서 ContentHandler를 변경하고 첫 번째 start 요소 이벤트를 새 콘텐츠 핸들러에 전달합니다. 생성자의 XMLReaderSelectorContentHandler를 전달하기 만하면됩니다. 모든 이벤트를 어휘 별 콘텐츠 핸들러로 전달해야하는 경우 SelectorContentHandler는 이벤트를 캐시 한 다음 전달해야하지만 대부분의 경우 필요하지 않습니다.

참고로 지금까지 거의 모든 프로젝트에서 XOM 을 사용하여 지금까지 XML을 처리했습니다. 성능은 문제가되지 않았습니다.

JAXB .XML 바인딩을위한 Java 아키텍처.기본적으로 XML 레이아웃을 정의하는 xsd를 만듭니다 (DTD를 사용할 수도 있다고 생각합니다).그런 다음 XSD를 JAXB 컴파일러에 전달하면 컴파일러가 Java 클래스를 생성하여 XML 문서를 Java 객체로 마샬링 및 언 마샬링합니다.정말 간단합니다.

BTW, 결과 클래스를 배치하려는 패키지 이름을 지정하는 jaxb 명령 줄 옵션이 있습니다.

더 동적 인 핸들링을 원한다면 Stax 접근 방식이 Sax보다 더 효과적 일 것입니다. 여전히 매우 낮은 수준입니다.더 간단한 접근 방식을 원한다면 XStream과 JAXB가 가장 좋습니다.그러나 매핑하려면 매우 단단한 물체가 필요합니다.

흥미롭게도 Stax를 사용하기를 원하는 StaxMan에 동의합니다.현재 사용중인 푸시 대신 풀 기반 파서입니다.그래도 코드를 크게 변경해야합니다.

:-)

예, Stax에 대한 편견이 있습니다.그러나 제가 말했듯이 데이터 바인딩은 스트리밍 솔루션보다 더 편리합니다.그러나 원하는 스트리밍이고 여러 필터링 단계의 파이프 라이닝이 필요하지 않은 경우 Stax는 SAX보다 간단합니다.

한 가지 더 : XOM만큼 좋은 것 (wrt 대안), "문서 중심"xml (~= xhtml 페이지, docbook, 오픈 오피스 문서)을 다루지 않는 경우에는 종종 트리 모델이 사용하기에 적합하지 않습니다.). 데이터 교환, 구성 파일 등의 경우 데이터 바인딩이 더 편리하고 효율적이며 자연 스럽습니다.이러한 사용 사례에서는 DOM과 같은 트리 모델을 거부하십시오. 그래서 JAXB, XStream, JibX가 좋습니다.또는 더 많은 맛을 얻으려면 소화조, 피마자, xmlbeans.

VTD-XML은 강력한 XML 처리를위한 최고의 XML 처리 기술로 알려져 있습니다.증거는 아래 참조를 참조하십시오.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top