Retrofit2, как анализировать XML с помощью встроенных тегов - PullRequest
0 голосов
/ 18 июня 2019

Я использую retrofit2 и простой анализатор xml для анализа значения xml в классе.

Но я никогда не сталкивался с этими встроенными (?) Тегами.API возвращает что-то, но тело ответа имеет значение null.

XML выглядит следующим образом.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Book title="Title Name" ver="20190513001" coverimg="PPO01.jpg" bookcode="PPO01">
    <chapters count="1">
        <chapter endflag="000" thumbnail="PPO0101_TN.jpg" chaptercode="PPO0101" num="1">
        <chaptername>ChapterName</chaptername>

        <movies count="1">

            <movie num="1" name="Movie Name" url="Some Url" type="AR">
                <directions count="0"/>

            </movie>
        </movies>
    </chapter>
</chapters>
</Book>

Мой код ответа для этого выглядит следующим образом.

Корневой объект.

@Root(name = "Book", strict = false)
public class XmlBook implements Serializable {

    @Element(name = "title")
    private String title;

    @Element(name = "ver")
    private String ver;

    @Element(name = "coverimg")
    private String coverimg;

    @Element(name = "bookcode")
    private String bookcode;

    @Element(name = "chapters")
    private XmlChapterHeader chapters;
}

Объект 'главы'.

@Root(name = "chapters", strict = false)
public class XmlChapterHeader {

    @Element(name = "count")
    private int count;

    @ElementList(name = "chapter", inline = true)
    private List<XmlChapter> chapter;

}

Объект 'глава'.

@Root(name = "chapter", strict = false)
public class XmlChapter {

    @Element(name = "num")
    private String num;

    @Element(name = "chaptercode")
    private String chaptercode;

    @Element(name = "thumbnail")
    private String thumbnail;

    @Element(name = "endflag")
    private String endflag;


    @Element(name = "chaptername")
    private String chaptername;


    @Element(name = "movies")
    private XmlMovieContainer movies;
}

Объект 'фильмы'.

@Root(name = "movies", strict = false)
public class XmlMovieContainer {

    @ElementList(name = "movies", inline = true)
    List<XmlMovie> movie;
}

Наконец, объект 'movie'.

@Root(name = "movie", strict = false)
public class XmlMovie {

    @Element(name = "directions")
    private int directions;
}

Я искал в Google эту проблему, но не могу найти правильное решение.Помогите пожалуйста!

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Я предлагаю TikXml для разбора xml, потому что его легче использовать и очень быстро сравнивать с другими парсерами xml.

Вы должны добавить Gradle плагины для Tikxml

implementation 'com.tickaroo.tikxml:annotation:0.8.13'
implementation 'com.tickaroo.tikxml:core:0.8.13'
implementation 'com.tickaroo.tikxml:retrofit-converter:0.8.13'

Модифицированная конфигурация:

TikXml tikxml = new TikXml.Builder().exceptionOnUnreadXml(false).build();
Retrofit retrofit =new  Retrofit.Builder()
                .baseUrl("base url")
                .addConverterFactory(TikXmlConverterFactory.create(tikxml))
                .build();

вам нужно создавать классы pojo с аннотациями tikxml

import com.tickaroo.tikxml.annotation.Attribute;
import com.tickaroo.tikxml.annotation.PropertyElement;
import com.tickaroo.tikxml.annotation.Xml;

import org.simpleframework.xml.Element;

import java.util.List;

@Xml
public class XmlBook {
    @Attribute(name = "title")
    String title;

    @Attribute(name = "ver")
    String ver;

    @Attribute(name = "coverimg")
    String coverimg;

    @Attribute(name = "bookcode")
    String bookcode;


    @Element(name = "chapters")
    Chapters chapters;
}
    @Xml
    public class Chapters {

        @Attribute(name = "count")
        String count;

        List<Chapter> chapters;

    }

    @Xml(name = "chapter")
    class Chapter {
        @PropertyElement(name = "chaptername")
        String chaptername;

        // ....
}  
0 голосов
/ 18 июня 2019

Я думаю, вы должны знать разницу между «XML-элементом» и «XML-атрибутом».

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

...