0

Previously, I was able to display the data of one tag, but this time not several values are displayed, but only one.

This my parser code:

public class Runner {

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser saxParser = spf.newSAXParser();
    XMLReader xmlReader = saxParser.getXMLReader();
    MyHandler handler = new MyHandler();
    xmlReader.setContentHandler(handler);

    xmlReader.parse("src/countries.xml");
    Countries branches = handler.getBranches();

    try (FileWriter files = new FileWriter("src/diploma/SAX.txt")) {
        files.write("Item " + "\n" + String.valueOf(branches.itemList) + "\n");
    }
}

private static class MyHandler extends DefaultHandler{
    static final String HISTORY_TAG = "history";
    static final String ITEM_TAG = "item";

    static final String NAME_ATTRIBUTE = "name";

    public Countries branches;
    public Item currentItem;
    private String currencyElement;

    Countries getBranches(){
        return branches;
    }

    public void startDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        currencyElement = qName;

        switch (currencyElement) {

            case HISTORY_TAG: {
                branches.itemList = new ArrayList<>();
                currentItem = new Item();
                currentItem.setHistoryName(String.valueOf(attributes.getValue(NAME_ATTRIBUTE)));
            } break;

            default: {}
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String text = new String(ch, start, length);

        if (text.contains("<") || currencyElement == null){
            return;
        }

        switch (currencyElement) {

            case ITEM_TAG: {
                currentItem.setItem(text);
            } break;

            default: { }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException{
        switch (qName) {

            case HISTORY_TAG: {
                branches.itemList.add(currentItem);
                currentItem = null;
            } break;

            default: {
            }
        }
        currencyElement = null;
    }

    public void endDocument() throws SAXException {
        System.out.println("SAX parsing is completed...");

    }
}
}

Class Item:

public class Item {

private String historyName;
private String item;

public String getItem() {
    return item;
}

public void setItem(String item) {
    this.item = item;
}

public String getHistoryName() {
    return historyName;
}

public void setHistoryName(String historyName) {
    this.historyName = historyName;
}

@Override
public String toString() {
    return
            "historyName = " + historyName + ", " + "\n" + "item = " + item + ", ";
}
}

And class Countries

public class Countries {

   public List<Item> itemList;
} 

I have problems with this part

  <history name="История">
    
        <item>
            История белорусских земель очень богата и самобытна. 
        </item>
        
        <item>
           Эту страну постоянно раздирали внутренние конфликты и противоречия, много раз она была втянута в войны.
        </item>
        
        <item>
            В 1945 году Беларусь вступила в состав членов-основателей Организации Объединенных Наций.
        </item>
    
    </history>

I only display the last "item" tag, and other duplicate tags are displayed only in the singular. I can't figure out where the error is, but I noticed that in "endElement" all values are displayed, but as one element. Maybe someone knows what's the matter?

1 Answer 1

0

You are creating a new ArrayList every time you encounter the item tag. That is why you only see one item displayed after parsing.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the answer, but it didn't help. I decided to switch to XmlPullParser, it solved my problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.