SAX парсинг тегов

117
19 июня 2019, 19:30

Каким образом можно по тексту тегов, которые внутри тега отцовского, узнать какому именно отцу он пренадлежит и выдать все значение внутри отца по одному из этих значений методом SAX?

DOM методом и XPATH уже обрабатывал, нужна помощь именно с SAX.

Ну грубо говоря, пользователь должен ввести Product1, а ему должно выдастся: Product1 пренадлежит тегу id внутри тега product и должeн выдастся спискок тип "значения этого тега"("Id", "Name", "Price")+ его значение, ну и как-бы полностю пролистать все что внутри продукта и выдать. Ну это всего лишь пример там должно быть чтоб оно не привзывалсь не к каким-то статчным именам а програма адекватно реагировала на смену всех тегов и добавления новых. Реализовал уже поиск по атрибутам:

DefaultHandler handler=new DefaultHandler(){
    public void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        String name= attributes.getValue(textField.getText());

        if(name!=null && !name.isEmpty()){
            System.out.println(name);
        }   
    }
    public void  characters(char[] ch, int start, int length) throws  SAXException{
        String str="";
        for(int i=0; i<length; i++){
            str+=ch[start+i];
        }if(textField.getText().equals("all")){
        System.out.println(str);}
    }
};
SAXParserFactory factory= SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(new File("src\\data\\products.xml"), handler);

Данные:

<products>
<product name="eee" price="122">
    <id>p01</id>
    <name>Product1</name>
    <price>100</price>
</product>
<product name="pp" price="123">
    <id>p02</id>
    <name>Product2</name>
    <price>200</price>
</product>
<product name="rr" price="124">
    <id>p03</id>
    <name>Product3</name>
    <price>300</price>
</product>
<product name="rrr" price="125">
    <id>p04</id>
    <name>Product4</name>
    <price>400</price>
</product>
Answer 1
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXHandler extends DefaultHandler {
    private final String query;
    private String currentTagName;
    private Product currentProduct;
    private static class Product {
        private String id;
        private String name;
        private int price;
        public void setId(String id) {
            this.id = id;
        }
        public String getId() {
            return id;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setPrice(String price) {
            this.price = Integer.parseInt(price);
        }
        public int getPrice() {
            return price;
        }
        public String toString() {
            return String.format("Id: %s\nName: %s\nPrice: %d\n", id, name, price);
        }
    }
    public SAXHandler(String query) {
        this.query = query;
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        currentTagName = qName;
        if(qName.equals("product")) {
            currentProduct = new Product();
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals("product")) {
            if (query.equals(currentProduct.getName()))
                System.out.println(currentProduct);
            currentProduct = null;
        }
        currentTagName = null;
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(currentProduct == null)
            return;
        String tagContent = new String(ch, start, length).trim();
        if ("id".equals(currentTagName))
            currentProduct.setId(tagContent);
        if ("name".equals(currentTagName))
            currentProduct.setName(tagContent);
        if ("price".equals(currentTagName))
            currentProduct.setPrice(tagContent);
    }
    public static void main(final String args[]) {
        if (args.length < 1) {
            System.err.println("Введите имя искомого продукта");
            return;
        }
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SAXHandler handler = new SAXHandler(args[0]);
            saxParser.parse("test.xml", handler);
        }
        catch(SAXException ex) {}
        catch(ParserConfigurationException ex) {}
        catch(IOException ex) {}
    }
}
Answer 2

Единственный способ определить родителя при использовании SAX -- сохранить иерархию тегов в процессе чтения документа. Возможно, для Вашей задачи больше подойдет DOM-парзер (см. DocumentBuilderFactory и DocumentBuilder).

READ ALSO
Gulp 4 выдает ошибку

Gulp 4 выдает ошибку

Исходники: Gulp4zip

110
Получить статус запроса ReactJS

Получить статус запроса ReactJS

Получаю ответ от API OpenWeatherMapКаким образом можно было бы получить код ответа и в зависимости от него отобразить контент? К примеру, если статус...

116
Изображение в массиве

Изображение в массиве

Как мне передать картинку через массив? Имеется массив Const LocalStorage = [ { Id: 1, Name: "one" … } … ]

89