StAX Parser creates an empty XML file

147 Views Asked by At

I'm learning parsers in Java and now I'm trying to write a code for XML-file creation using StAX Parser and XMLStreamWriter and StringWriter. But I forced with a problem that my parser creates an empty XML-file. I think the problem is in using for-loop, but I don't know how to fix that. Here's a snippet of a code:

public class STAXParser4 {
...
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException { 
...
        try (FileWriter fileWriter = new FileWriter("STAX1ShoesShop.xml")){
            StringWriter stringWriter = new StringWriter();
            XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
            XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(stringWriter);
            
            xmlStreamWriter.writeStartDocument();
            xmlStreamWriter.writeStartElement("ss:ShoesShop");
            ShoesShop shoesShop = new ShoesShop();
            
            for(Shoes shoes: shoesShop.getShoes()){ 
                xmlStreamWriter.writeStartElement("ss:shoes");
                xmlStreamWriter.writeAttribute("id", String.valueOf(shoes.getId()));
                
                xmlStreamWriter.writeStartElement("ss:title");
                xmlStreamWriter.writeCharacters(shoes.getTitle());
                xmlStreamWriter.writeEndElement();
                
                xmlStreamWriter.writeStartElement("ss:brand");
                xmlStreamWriter.writeCharacters(shoes.getBrand().toString());
                xmlStreamWriter.writeEndElement();
                
                xmlStreamWriter.writeStartElement("ss:category");
                xmlStreamWriter.writeCharacters(shoes.getCategory().toString());
                xmlStreamWriter.writeEndElement();
                
                xmlStreamWriter.writeStartElement("ss:season");
                xmlStreamWriter.writeCharacters(shoes.getSeason().toString());
                xmlStreamWriter.writeEndElement();
                
                xmlStreamWriter.writeStartElement("ss:price");
                xmlStreamWriter.writeCharacters(String.valueOf(shoes.getPrice()));
                xmlStreamWriter.writeEndElement();
                
                xmlStreamWriter.writeEndElement();
            } 
            xmlStreamWriter.writeEndElement();
            xmlStreamWriter.writeEndDocument();
            
            xmlStreamWriter.flush();
            xmlStreamWriter.close();
        } catch (XMLStreamException | IOException e) {
            e.printStackTrace();
        }
        
    }
}

Also here's a Java class for Shoes

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Shoes", propOrder = {
    "title",
    "brand",
    "category",
    "season",
    "gender",
    "details",
    "price"
})
public class Shoes
    extends Entity
{
    @XmlElement(required = true)
    protected String title;
    @XmlElement(required = true)
    @XmlSchemaType(name = "string")
    protected Brand brand;
    @XmlElement(required = true)
    @XmlSchemaType(name = "string")
    protected Category category;
    @XmlElement(required = true)
    @XmlSchemaType(name = "string")
    protected Season season;
    @XmlElement(required = true)
    protected Shoes.Gender gender;
    @XmlElement(required = true)
    protected Shoes.Details details;
    protected double price;
    @XmlAttribute(name = "stock", required = true)
    protected boolean stock;
    @XmlAttribute(name = "mostWanted")
    protected Boolean mostWanted;

    public String getTitle() {
        return title;
    }

    public void setTitle(String value) {
        this.title = value;
    }
    
    public Brand getBrand(){
        return brand;
    }
    
    public void setBrand(Brand value){
        this.brand = value;
    }
    
    public Category getCategory(){
        return category;
    }
    
    public void setCategory(Category value){
        this.category = value;
    }
    
    public Season getSeason(){
        return season;
    }
    
    public void setSeason(Season value) {
        this.season = value;
    }

    public Shoes.Gender getGender() {
        return gender;
    }

    public void setGender(Shoes.Gender value) {
        this.gender = value;
    }

    public Shoes.Details getDetails() {
        return details;
    }

    public void setDetails(Shoes.Details value) {
        this.details = value;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double value) {
        this.price = value;
    }

    public boolean isStock() {
        return stock;
    }

    public void setStock(boolean value) {
        this.stock = value;
    }

    public Boolean isMostWanted() {
        return mostWanted;
    }

    public void setMostWanted(Boolean value) {
        this.mostWanted = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {

    })
    public static class Details {

        @XmlElement(required = true)
        protected String highlights;
        @XmlElement(required = true)
        protected String composition;

        public String getHighlights() {
            return highlights;
        }

        public void setHighlights(String value) {
            this.highlights = value;
        }

        public String getComposition() {
            return composition;
        }

        public void setComposition(String value) {
            this.composition = value;
        }

    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "\u043c\u0443\u0436\u0441\u043a\u043e\u0439Or\u0416\u0435\u043d\u0441\u043a\u0438\u0439"
    })
    public static class Gender {

        @XmlElementRefs({
            @XmlElementRef(name = "\u0436\u0435\u043d\u0441\u043a\u0438\u0439", namespace = "http://www.example.org/ShoesShop", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "\u043c\u0443\u0436\u0441\u043a\u043e\u0439", namespace = "http://www.example.org/ShoesShop", type = JAXBElement.class, required = false)
        })
        protected List<JAXBElement<String>> maleOrFemale;

        public List<JAXBElement<String>> getMaleOrFemale() {
            if (maleOrFemale == null) {
                maleOrFemale = new ArrayList<JAXBElement<String>>();
            }
            return this.maleOrFemale;
        }
    }
}

The data for Shoes shoes: shoesShop.getShoes I get from another XML-file. Here's a snippet of this file:

<ss:ShoesShop xmlns:ss="http://www.example.org/ShoesShop" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/ShoesShop ShoesShop.xsd ">
      <ss:shoes id="1" stock="true">
        <ss:title>Baltrum</ss:title>
        <ss:brand>Gucci</ss:brand>
        <ss:category>Boots</ss:category>
        <ss:season>fall</ss:season>
        <ss:price>734.0</ss:price>
      </ss:shoes>
  <ss:shoes id="2" stock="true" mostWanted = "true">
    <ss:title>Amalfi</ss:title>
    <ss:brand>Dior</ss:brand>
    <ss:category>Mules</ss:category>
    <ss:season>winter</ss:season>
    <ss:price>364.0</ss:price>
  </ss:shoes>
</ss:ShoesShop>
1

There are 1 best solutions below

2
On

The problem is that you are writing the output into stringWriter but it is in no way connected to your output file.
Try replacing the stringWriter with fileWriter and you will see xml written to the output file:

    try (FileWriter fileWriter = new FileWriter("STAX1ShoesShop.xml")){
        XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
        XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(fileWriter);