@Young_nigilist

Как достать информацию из тега в котором тег xml?

Добрый день!
Столкнулся с проблемой при sax-парсинге xml-файла.
В xml-файле
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title>TUT.BY: АВТО - Дорога</title>
        <link>https://auto.tut.by/</link>
        <description>Новости автобизнеса, обзоры авто, тест-драйвы и актуальная информация для автовладельцев в Беларуси. Свежие новости о происшествиях в Беларуси.</description>
        <language>ru</language>
        <image>
            <url>https://img.tyt.by/i/rss/auto/logo.gif</url>
            <title>TUT.BY: АВТО - Дорога</title>
            <link>https://auto.tut.by/</link>
        </image>
        <pubDate>Thu, 26 Nov 2020 12:10:00 +0300</pubDate>
        <lastBuildDate>Wed, 25 Nov 2020 15:13:21 +0300</lastBuildDate>
        <ttl>10</ttl>
        <atom:link href="https://news.tut.by/rss/auto/road.rss" rel="self" type="application/rss+xml" />
        <item>
            <title>На свидетеля по делу избитого ОМОНом таксиста в Гродно также завели уголовное дело</title>
            <link>https://auto.tut.by/news/road/709155.html?utm_campaign=news-feed&#x26;utm_medium=rss&#x26;utm_source=rss-auto</link>
            <description>&#x3C;img src="https://img.tyt.by/thumbnails/n/regiony/0a/2/aleksey_sud_taksist_1_1_.jpg" width="72" height="54" alt="Фото: TUT.BY" border="0" align="left" hspace="5" /&#x3E;В Гродно продолжаются судебные заседания по уголовному делу в отношении местного таксиста Алексея Лапы, которого обвиняют по ст. 364 УК (Насилие либо угроза насилия в отношении сотрудника ОВД). Пострадавшие - два сотрудника ОМОНа - Артем Логиш и Дмитрий Конон. Также выяснилось, что на друга таксиста - Игоря Лозовика, который находился в машине вместе с Алексеем, также завели уголовное дело по данной статье. Однако первый допрос по данному делу прошел только 13 ноября.&#x3C;br clear="all" /&#x3E;</description>
            <atom:author>
                <atom:name>TUT.BY</atom:name>
                <atom:uri>https://news.tut.by/author/490~613.html</atom:uri>
            </atom:author>
            <category domain="https://auto.tut.by/rubric/road/">Дорога</category>
            <enclosure url="https://img.tyt.by/n/regiony/0a/2/aleksey_sud_taksist_1_1_.jpg" type="image/jpeg" length="160924" />
            <guid isPermaLink="true">https://auto.tut.by/news/road/709155.html?utm_campaign=news-feed&#x26;utm_medium=rss&#x26;utm_source=rss-auto</guid>
            <pubDate>Wed, 25 Nov 2020 14:55:00 +0300</pubDate>
            <media:content url="https://img.tyt.by/n/regiony/0a/2/aleksey_sud_taksist_1_1_.jpg" type="image/jpeg" medium="image" height="1200" width="1600" fileSize="160924" />
            <media:content url="https://img.tyt.by/n/regiony/00/e/aleksey_sud_taksist_1.jpg" type="image/jpeg" medium="image" height="1200" width="1600" fileSize="204169" />
            <media:content url="https://img.tyt.by/n/regiony/05/5/1598332632.jpg" type="image/jpeg" medium="image" height="869" width="1269" fileSize="234900" />
        </item>
<item>...</item>
...


У меня не получается вывести всю информацию из тега link, выводит обрезано. Также и с тегом description.
5fc4d3a5d2522500564094.png
И еще, как достать информацию только из тегов item?
Мой код:
public class SaxParser {
    public static Channel channelObj;

    public static Channel parse() throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLHandler handler = new XMLHandler();
        parser.parse("resources/tutby.xml", handler);
        return channelObj;
    }

    private static class XMLHandler extends DefaultHandler {
        private static final ArrayList<Item> items_t = new ArrayList<>();
        private String lastElementName;
        private String title_t;
        private String link_t;
        private String description_t;
        private Channel channel_t;

        boolean title_b = false;
        boolean link_b = false;
        boolean description_b = false;

        @Override
        public void endDocument() {
            channelObj = channel_t;
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) {
            if (qName.equalsIgnoreCase("title")) {
                title_b = true;
            }
            if (qName.equalsIgnoreCase("link")) {
                link_b = true;
            }
            if (qName.equalsIgnoreCase("description")) {
                description_b = true;
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String information = new String(ch, start, length);
            information = information.replace("\n", "").trim();
            if (!information.isEmpty()) {
                if (title_b) {
                    title_t = information;
                    System.out.println("\nTitle: " + title_t);
                    title_b = false;
                }
                if (link_b) {
                    link_t = information;
                    System.out.println("\nLink: " + link_t);
                    link_b = false;
                }
                if (description_b) {
                    description_t = information;
                    System.out.println("\nDescription: " + description_t);
                    description_b = false;
                }
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) {
            if (qName.equals("item")) {
                if ((title_t != null && title_t.length() != 0)
                        && (description_t != null && description_t.length() != 0)
                        && (link_t != null && link_t.length() != 0)) {
                    items_t.add(new Item(description_t, title_t, link_t));
                }
                title_t = null;
                description_t = null;
                link_t = null;

                if (qName.equals("channel")) {
                    channel_t = new Channel(items_t);
                }
            }
        }
    }
}
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ответы на вопрос 1
@jetkay
Разраб
Может посмотреть в сторону XSL-Transform?
Попробуйте с помощью неё извлечь нужные Вам фрагменты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы