2

I try to understand how is working the mechanism of STAX java.

I have this xml file

<?xml version="1.0" encoding="UTF-8"?>
<orders>
    <order created='2012-07-12T15:29:33.000' ID='2343'>
        <product>
            <description>Sony 54.6" (Diag) Xbr Hx929 Internet Tv</description>
            <gtin>00027242816657</gtin>
            <price currency="USD">2999.99</price>
            <supplier>Sony</supplier>
        </product>
        <product>
            <description>Apple iPad 2 with Wi-Fi 16GB - iOS 5 - Black</description>
            <gtin>00885909464517</gtin>
            <price currency="USD">399.0</price>
            <supplier>Apple</supplier>
        </product>
        <product>
            <description>Sony NWZ-E464 8GB E Series Walkman Video MP3 Player Blue</description>
            <gtin>00027242831438</gtin>
            <price currency="USD">91.99</price>
            <supplier>Sony</supplier>
        </product>
    </order>
    <order created='2012-07-13T16:02:22.000' ID='2344'>
        <product>
            <description>Apple MacBook Air A 11.6" Mac OS X v10.7 Lion MacBook</description>
            <gtin>00885909464043</gtin>
            <price currency="USD">1149.0</price>
            <supplier>Apple</supplier>
        </product>
        <product>
            <description>Panasonic TC-L47E50 47" Smart TV Viera E50 Series LED HDTV</description>
            <gtin>00885170076471</gtin>
            <price currency="USD">999.99</price>
            <supplier>Panasonic</supplier>
        </product>
    </order>
</orders>

To mimic the behavior of this XML file we created an object with similar attributes

public class Product {

    private int orderID;
    private String createTime;
    private String description;
    private String gtin;
    private String price;
    private String supplier;
//getter and setter
}

With this I tried to read my xml file:

if (xmlEvent.isStartElement()){
               StartElement startElement = xmlEvent.asStartElement();
               if(startElement.getName().getLocalPart().equals("order")){
                   prod = new Product();
                   Attribute idAttr = startElement.getAttributeByName(new QName("ID"));
                   if(idAttr != null){
                       prod.setgetOrderID(Integer.parseInt(idAttr.getValue()));
                   }

                   Attribute orderTime = startElement.getAttributeByName(new QName("created"));
                   if(orderTime != null){
                       prod.setgetCreateTime(orderTime.getValue());
                   }




                   counter++;
                   //System.out.println("Obiect creat");
                 System.out.println(counter);
               }
               //set the other varibles from xml elements
               else if(startElement.getName().getLocalPart().equals("description")){
                   xmlEvent = xmlEventReader.nextEvent();
                   prod.setDescription(xmlEvent.asCharacters().getData());

               }else if(startElement.getName().getLocalPart().equals("gtin")){
                   xmlEvent = xmlEventReader.nextEvent();
                   prod.setGtin(xmlEvent.asCharacters().getData());

               }else if(startElement.getName().getLocalPart().equals("price")){
                   xmlEvent = xmlEventReader.nextEvent();
                   prod.setPrice(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("supplier")){
                   xmlEvent = xmlEventReader.nextEvent();
                   prod.setSupplier(xmlEvent.asCharacters().getData());

               }

My problem is that, they are 5 products, but when I try to output them, are not the correct number. 1. If in: if(startElement.getName().getLocalPart().equals("orders")) the last parameter is "oders" in the output i see just one object (Panasonic TC-L47E50 47" Smart TV Viera E50 Series LED HDTV)

  1. If last parameter is order in my output are 2 objects
  2. if last parameter is "product" in my output I have all of them, 5.

What modification i need to do, for read entire information. My scope is to read the attribute "created" and "id" of order but with all my objects, not 1 or 2 Thanks !

1 Answer 1

0

If you're using JaxB, you don't neet to create classes either even parse XML file by yourself, that's why JaxB is made for! :)


Basic steps to read-write xml using JaxB / Unmarshaller and XSD

  • Create a valid XSD file of your XML structure.
  • Place it in your project folder.
  • Right click XSD file and auto-generate JAXB classes.
  • Use Unmarshaller to populate auto-generated classes from XML file:

    Unmarshaller u = jc.createUnmarshaller();
    Orders os = (Orders) u.unmarshal( new FileInputStream( "orders.xml" ) );
    

That's it... JaxB will take care of classes, attributes, populate, write/read xml...

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

3 Comments

It is easy for you, because you have experience........for me its a new begin for new documentation :-<
Just follow the steps and links provided, its easier than you expect
And comment if you get stuck in any step!!

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.