XML EXERCISES
Sam Guinea
guinea@elet.polimi.it
http://servicetechnologies.wordpress.com/
SAX VS DOM
SAX
• Simple API for XML
• Event-based sequential access parser API
• There is no formal definition
• Only a JAVA implementation that is normative
• Documents are parsed state-dependently
SAX Parsers
• A SAX Parser functions as a stream parser
• With an event-driven API
• SAX parsing is unidirectional
• We define callback methods for the events
• SAX events:
• XML Text nodes
• XML Element Starts and Ends
• XML Processing Instructions
• XML Comments
SAX Benefits vs Drawbacks
• Memory Usage is negligible
• Minimum memory is proportional to the maximum depth
of the XML file
• Maximum data involved in a single XML event
• Fastest kind of parsing for indexing, conversion,
formatting, etc.
• Makes it hard to do XML validation and queries (Xpath)
DOM
• Document Object Model
• Cross-platform and language-independent
• A document gains an object-based representation in
memory
• Nodes are accessed through object methods
• Origin tied to browser wars
• Fundamental piece of software for managing pages
• Used a lot in Java Web service technology stack
DOM Benefits vs Drawbacks
• Makes it easy to manage XML files
• Validation is simple
• Possible to query the document
• Can be slow to build the tree-like representation
• Occupies a lot of memory
• Can be made more efficient through persistency
Let’s see some Java code…
• SAX
• How to read an XML file
• DOM
• How to read an XML file
• How to modify an XML file
• How to create an XML file
• How to count XML elements
JAXB
JAXB
• Java Architecture for XML Binding.
• Provides a fast and convenient way to bind between XML
schemas and Java representations.
• Used to:
• unmarshall XML instance document into Java content trees
• marshall Java content trees into XML instance documents.
• generate XML schemas from Java objects.
JAXB Binding Process
• Compiling classes.
• Unmarshalling.
• Generating content tree of data
objects instantiated from the
generated JAXB classes.
• Validate both source XML
documents and processed
content.
• Process content.
• Marshalling.
Representing XML Content
• Grouping the generated classes in packages.
• A package comprises:
• A Java class name is derived from the element name.
• An ObjectFactory class used to return instances of a bound Java
class.
• Schema 2 Java
• xsd:string à java.lang.String
• xsd:int à int
• xsd:dateTime à javax.xml.datatype.XMLGregorianCalendar
• xsd:anySimpleType à java.lang.Object
@XmlRootElement
@XmlRootElement( name="doc" )
public class Document {
@XmlElement
protected Foo foo;
// ...
}
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<foo>...</foo>
</doc>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:complexType name="Foo">
...
</xsd:complexType>
<xsd:complexType name="Document">
<xsd:sequence>
<xsd:element name="foo" type="Foo"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="doc" type="Document"/>
@XmlType
This annotation adds information that would be available from a schema type, but isn't implied by a
Java class declaration. The annotation has several attributes:
- The attribute name provides the XML schema name if you don't want to use the class name.
- The namespace attribute provides the name of the target namespace.
- The string array value defined by propOrder establishes an ordering of the sub-elements
@XmlRootElement
@XmlType( propOrder={ "title", "items", "cluster" } )
public class Document {
...
}
@XmlSchema
This annotation can only be used with a package. It defines parameters that are derived from the
xsd:schema element
@javax.xml.bind.annotation.XmlSchema(
namespace = "http://www.laune.at/hospital",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package hospital;
<xs:schema elementFormDefault="qualified"
targetNamespace="http://www.laune.at/hospital"
xmlns:tns="http://www.laune.at/hospital"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0" >
@XmlAccessorType
If JAXB binds a class to XML, then, by default, all public members will be bound, i.e., public getter and
setter pairs, or public fields. Any protected, package-visible or private member is bound if it is
annotated with a suitable annotation such as XmlElement or XmlAttribute. You have several
possibilities to influence this default behaviour.
XmlAccessType.FIELD
XmlAccessType. PROPERTY
@XmlElement and @XmlAttribute
@XmlElement(name = "Preamble", required = true)
protected PreambleType preamble;
@XmlElement(name = "Workplace", required = true)
protected List<SysWorkplaceType> workplace;
<xsd:sequence>
<xsd:element name="Preamble" type="com:PreambleType"/>
<xsd:element name="Workplace" type="SysWorkplaceType"
minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
@XmlAttribute
final static int answer = 42;
@XmlValue
public class Price {
private BigDecimal amount;
public Price(){}
@XmlElement
public BigDecimal getAmount(){
return amount;
}
public void setAmount( BigDecimal value ){
this.amount = value;
}
}
<xs:complexType name="price">
<xs:sequence>
<xs:element name="amount" type="xs:decimal" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<price>
<amount>123.45</amount>
</price>
@XmlValue
public class Price {
// ...
@XmlValue
public BigDecimal getAmount(){
return amount;
}
// ...
}
<xs:simpleType name="price">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<price>123.45</price>
Examples
• Unmarshal Read
• how to unmarshal an XML document into a Java content tree and
access the data contained within it.
• How to modify the data and push it back to XML
• Adding XSD Validation
• how to enable validation during unmarshalling.
• Creating a model
• Model creation and generation of an XSD
• Personalization of model mapping
Schema Validation
boolean handleEvent(ValidationEvent event)
Parameters:
event - the encapsulated validation event information. It is a provider error if this
parameter is null.
Returns:
true if the JAXB Provider should attempt to continue the current unmarshal,
validate, or marshal operation after handling this warning/error, false if the
provider should terminate the current operation with the appropriate.
Throws:
IllegalArgumentException - if the event object is null.
XPATH IN JAVA
JAXEN
• Open source XPath library written in Java
• http://jaxen.codehaus.org/
• Chosen by Sun for
• JSP Standard Tag Library
• Java Web services Development Pack 1.0 and 1.1
• Java API for XML Messaging
• Means we can use it with SOAP messages
Only three steps
• Construct an XPath object by passing a String containing
an XPath expression
• public DOMXPath(String expression)
throws JaxenException;
• Set the namespace bindings by calling
• public void addNamespace(String prefix, String uri)
throws JaxenException;
• Evaluate the expression (methods vary depending on
desired result type)
• public List selectNodes(Object context)
throws JaxenException;
LAB EXERCISES
Esercizio parte 1
• Mediante annotazioni JAXB creare l’XML Schema per la
gestione di una libreria (bookstore.xsd)
• Bookstore
• Book
• Title
• Author
• Date
• ISBN
• Publisher
• Cost
Esercizio parte 2
• Usare lo schema “bookstore.xsd” definito al punto
precedente per generare le classi del modello della
libreria
• Scrivere un programma che crea una libreria di 10 libri e
lo serializza e salva in un file XML chiamato “books.xml”
Esercizio parte 3
• Scrivere un programma che carica il contenuto del file
“books.xml” in memoria sotto forma di DOM
• Usare Xpath per rispondere alle seguenti query
• Restituire tutti gli autori
• Restituire tutti i libri scritti da un autore a vostra scelta
• Restituire tutti i libri ce hanno un costo superiore a 10 euro
• Restituire i nomi degli editori che pubblicano libri che costano più di
10 euro