2012-05-17 3 views
2

У меня проблема с разбора XML в Android приложение, вопрос here подразумевает, что существует 4 типа механизма XML разбора консультировали: - SAX - DOM - XmlPullParser - Simple XML FrameworkПростой XML Framework Parser Issue - XML ​​Синтаксический в Android

В то время как Simple Framework потрясающе, и я уже работал с ней. Я ударил в тупик, когда узнал, что не может поддерживать @Text и @Element в том же классе, что отстой, потому что я могу 'меняем мою XML-схему.

Поэтому идеи приветствуются, и любые советы будут замечательными.

ответ

3

Ну, после долгого исследования я нашел, что лучшим парсером XML, подходящим для моих нужд, был JAXB Parser.

  • Поддерживает сложные типы.
  • Аннотация Ориентированные.
  • Хорошо работает с Android.
  • Очень легко понять.
  • Инструменты для генерации аннотированных классов JAXB уже существуют в Java 1.6+

Пример, чтобы показать, как легко использовать:

@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; 

Так что лучшее, что я придумал.


Любые дополнения приветствуются :)

4

SJXP высокая библиотека производительности построена как очень тонкий слой на верхней части STAX тянуть разбор спецификации (не работает на Android с не зависимостей).

Это не библиотека ORM, как Simple или JAXB, вместо этого она ориентирована на максимальную производительность синтаксического анализа, предоставляемую нам спецификацией разбора pull, но с всплеском XPath для обеспечения простых для определения правил анализа вместо управляя состоянием вытягивающего парсера.

Например, вы бы ориентироваться на определенные элементы в XML с помощью правила, например, так (это мой пример RSS парсер построен с ним):

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... 
    } 
} 

Вы определяете любое количество правил и дать им к экземпляру XMLParser (который многократно используется), а затем просто передайте его InputStreams для XML для анализа для вас в соответствии с этими правилами.

Исчерпывающие служебные данные SJXP ontop синтаксического анализатора близки к нулю (как памяти, так и процессора) - это буквально составляет однократные вычисления хеш-кода, а затем просто целые сравнения, чтобы увидеть, соответствует ли правило правилу текущую позицию анализатора XML, когда он проходит через контент.

Он поддерживает атрибуты и символьные данные - библиотека даже имеет приятный и элегантный способ поддержки пространств имен с помощью [] -notation ... например:

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! 
    } 
} 

Библиотека не предназначалась для быть другой магической абстракцией, которая скрывает все от вас; он должен быть немного более низким, чем этот, но все же выше, чем STAX, анализируя непосредственно, не вводя память или раздувание процессора в процесс синтаксического анализа для встроенных или высокопроизводительных систем (он был написан для синтаксических анализаторов, используемых в длительных процессах spidering).

+0

Спасибо за Ваш ответ. Хотя то, что вы предложили, отлично, я ищу что-то ориентированное на Аннотацию, потому что это то, что я считаю лучшим для моей сложной схемы XML, потому что отношения это очень спагетти. Итак, можете ли вы, если знаете, предоставить мне что-то ориентированное на Аннотацию. –

+0

Mohamed, к сожалению, Simple XML - единственная рекомендация, которую я хотел бы использовать для работы на Android и аннотации. Сожалею. –

Смежные вопросы