2012-05-17 2 views
2

나는 안드로이드 응용 프로그램에서 XML을 구문 분석에 문제가있어에서 XML 구문 분석은, 질문 here는 조언 XML 파싱 메커니즘의 4 가지 유형이 있다는 것을 의미한다 - 간단한 XML 프레임간단한 XML 프레임 워크 파서 문제 안드로이드

단순한 프레임 워크가 놀랍기는하지만 나는 이미 그것으로 작업하고 있었다. 나는 같은 클래스의 @Text와 @Element를 지원할 수 없다는 것을 알았을 때 막 다른 골목을 쳤다. 내 XML 스키마를 변경하지 마십시오.

아이디어가 만족스럽고 조언은 훌륭합니다. 당신이 http://code.google.com/p/xstream-for-android/

답변

3

오랫동안 연구 한 결과 JAXB 파서가 내 요구에 가장 적합한 XML 파서를 찾았습니다.

  • 복합 유형을 지원합니다.
  • 주석 지향.
  • Android에서 잘 작동합니다.
  • 매우 이해하기 쉽습니다.
  • JAXB 주석 클래스를 생성하는 도구가 이미 Java 1에 있습니다.
    @XmlRootElement(name = "a") 
    public class A { 
    
    @XmlElementRefs({ 
        @XmlElementRef(name = "lang", namespace = "http://www.w3.org/namespace/", type = Lang.class, required = false), 
        @XmlElementRef(name = "subst", namespace = "http://www.w3.org/namespace/", type = Subst.class, required = false), 
        @XmlElementRef(name = "include", namespace = "http://www.w3.org/namespace/", type = Include.class, required = false), 
        @XmlElementRef(name = "br", namespace = "http://www.w3.org/namespace/", type = Br.class, required = false), 
        @XmlElementRef(name = "kw", namespace = "http://www.w3.org/namespace/", type = Kw.class, required = false), 
        @XmlElementRef(name = "help", namespace = "http://www.w3.org/namespace/", type = Help.class, required = false) 
    }) 
    @XmlMixed 
    protected List<Object> content; 
    @XmlAttribute(name = "cost") 
    protected String cost; 
    @XmlAttribute(name = "href", required = true) 
    protected String href; 
    @XmlAttribute(name = "key") 
    protected String key; 
    

    이 그래서 내가 생각 해낸 최고였다 : 6 +

예제는 사용하는 것이 얼마나 쉬운 표시합니다.


모든 추가는 환영합니다 :) 답장을 보내

1

XStream을 매우 쉽게 (더 안드로이드에서 작동하지 않습니다 의존성).

단순 또는 JAXB와 같은 ORM 라이브러리가 아니며 대신 끌어 오기 구문 분석 사양에서 제공하는 최대 구문 분석 성능에 초점을 맞추지 만 XPath를 시작하면 쉽게 구문 분석 규칙을 정의 할 수 있습니다. 끌어 오기 파서의 상태를 직접 관리합니다. 당신은 규칙의 수를 정의하고 제공

IRule linkRule = new DefaultRule(Type.CHARACTER, "/rss/channel/item/link") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     // 'text' is the link; store it, print it, whatever you need... 
    } 
} 

: (이 함께 내장 내의 RSS 파서 예이다)과 같이

예를 들어, 당신은 규칙으로 XML의 특정 요소를 대상 것이다 XMLParser (다시 사용할 수 있음)의 인스턴스에 추가 한 다음 XML에 대한 InputStreams를 해당 규칙에 따라 구문 분석합니다.

끌어 오기 구문 분석기의 SJXP ontop의 구문 분석 오버 헤드는 0에 가까우며 (메모리 및 CPU 오버 헤드 모두) 문자 그대로 1 회 해시 코드 계산에 이른 다음 정수 비교가 발생하여 규칙에 일치하는 규칙이 있는지 확인합니다 내용을 통해 실행되는 XML 파서의 현재 위치입니다.

이 속성과 문자 데이터를 지원 - 라이브러리도 예를 들어 ... [] 표기법을 사용하여 네임 스페이스를 지원하는 멋지고 우아한 방법이 있습니다 도서관이에 의미되지 않았다

IRule channelSubjectRule = new DefaultRule(Type.CHARACTER, "/rss/channel/[http://purl.org/dc/elements/1.1/]subject") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     // Got the Channel's dc:subject value! I win! 
    } 
} 

당신에게서 모든 것을 숨기는 또 다른 불가사의 한 추상화가 되십시오. 이보다 약간 낮은 수준이지만 임베디드 또는 고성능 시스템을위한 구문 분석 프로세스에 메모리 또는 CPU가 부풀려지지 않고 직접 STAX 구문 분석보다 높습니다 (장기 실행 스파이더 프로세스에 사용되는 피드 구문 분석기 용으로 작성되었습니다).).

4

SJXP는 STAX 풀 파싱 사양의 상단에 매우 얇은 층으로 내장 된 고성능 라이브러리가에/객체 에서 XML을 매핑 할 경우

+0

감사합니다. 당신이 제안한 것이 훌륭하지만, 복잡한 XML 스키마에 가장 적합하다고 생각하기 때문에 주석 지향적 인 것을 찾고 있습니다. 관계가 매우 스파게티이기 때문입니다. 아시다시피, 제발 어노테이션 지향적 인 것을 제게 제공해주십시오. –

+0

모하메드, 안타깝게도 안드로이드 및 어노테이션 기반 작업에 대한 간단한 XML 만 권장합니다. 죄송합니다. –