Java'da temel olarak iki parser türü vardır :
<!--?xml version="1.0" encoding="ISO-8859-9"--> <test> <person id="12"> <name>Ali</name> <tel id="home">02129456789</tel> </person> <person id="asd"> <name>Veli</name> <tel id="home">02124365</tel> </person> <person id="fasf"> <name>Yusuf</name> <tel id="home">1212162840</tel> </person> </test>Bu dosyanın tüm içeriğini ekrana basan örnek aşağıdaki gibidir :
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
public class SAXTest {
private String theFile;
public SAXTest(String file) {
theFile = file;
}
public void print() {
DefaultHandler handler = new DefaultHandler() {
@Override
public void startElement(String uri, String lname, String qname, Attributes attributes) {
System.out.println("element name: " + qname);
for (int i = 0; i < attributes.getLength(); i++) {
String name = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.println(" attribute name= " + name + " value= " + value);
}
}
@Override
public void characters(char[] ch, int start, int finish) {
String s = new String(ch, start, finish);
System.out.println("element value: " + s);
}
};
try {
SAXParser parser = getParser();
parser.parse(theFile, handler);
} catch (Exception e) {
e.printStackTrace();
}
}
public SAXParser getParser() throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
return factory.newSAXParser();
}
static public void main(String[] args) {
String file = "test.xml";
SAXTest test = new SAXTest(file);
test.print();
}
}
Önce bir SAXParser nesnesini veren bir fonksiyon yarattık :
public SAXParser getParser() throws Exception{
SAXParserFactory factory=SAXParserFactory.newInstance();
return factory.newSAXParser();
}
Bir XML Document'ini parse etmek için bir Handler vermemiz gereklidir. Bu handler nesnesi document'le ile ilgili tüm olaylarda çağrılacaktır. Biz startElement ve characters method'larını dolduruyoruz. startElement bir element'te rastalndığında , characters method'u ise text'ler rastlandığında çağrılacaktır. Biz handler'i şu şekilde yarrattık
DefaultHandler handler=new DefaultHandler(){
public void startElement(String uri,String lname,String qname,Attributes attributes){
//element'e rastlandı
}
public void characters(char[] ch, int start, int finish){
//karaktere rastlandı
}
};
daha sonra parse etme işlemini yapıyoruz.SAXParser parser=getParser(); parser.parse(theFile,handler);getParser method'u bize SAXParser'ı vermektedir. Tüm bu işlemler print methodunun içinde yapılmıştır. print methodu çağrıldığında verilen XML'deki element'ler ve element'leri değerleri basılacaktır.
String s=new String(ch,start,finish);
<?xml version="1.0" encoding="ISO-8859-9"> <test> <person id="12"> <name>Ali</name> <tel id="home">02129456789</tel> </person> <person id="asd"> <name>Veli</name> <tel id="home">02124365</tel> </person> <person id="fasf"> <name>Yusuf</name> <tel id="home">1212162840</tel> </person> </test>DOM Parser kodu aşağıdaki gibidir :
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.w3c.dom.NodeList;
import java.io.*;
public class DOMTest {
public void print(String file) throws Exception {
Document doc = getDocument(file);
Element root = doc.getDocumentElement();
printNode(root);
}
public void printNode(Node node) {
System.out.println("name: " + node.getNodeName() + " value: " + node.getNodeValue());
printAttribute(node);
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
aNode = list.item(i);
printNode(aNode);
}
}
public void printAttribute(Node node){
NamedNodeMap map=node.getAttributes();
if(map!=null){
for(int i=0;iNode aNode=map.item(i);
String name=aNode.getNodeName();
String value=aNode.getNodeValue();
System.out.println("Attribute: "+name+" : "+value);
}
public DocumentBuilder getBuilder() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
return factory.newDocumentBuilder();
}
public Document getDocument(String file) throws Exception {
DocumentBuilder builder = getBuilder();
return builder.parse(new File(file));
}
static public void main(String[] args) {
try {
DOMTest test = new DOMTest();
test.print("test.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Önce DocumentBuilder nesnesini yaratmamız gerekir. Ardından Document nesnesini oluşturmak için DocumentBuilder nesnesinin parse methodu kullanılır
public DocumentBuilder getBuilder() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
return factory.newDocumentBuilder();
}
public Document getDocument(String file) throws Exception{
DocumentBuilder builder=getBuilder();
return builder.parse(new File(file));
}
getBuilde method'u bize DocumentBuilder verir. getDocument methodu ise verilen bir file için Document nesnesini bize döndürür.Element root=doc.getDocumentElement();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( new InputSource(new StringReader(xmlString))) ;
<commands> <command key="EN"> <p name="Go" required="true" type="integer"/> <p name="Come" required="true" type="string"/> </command> <command key="TR"> <p name="Gel" required="true" type="string"/> <p name="Git" required="true" type="float"/> </command> </commands>Görüldüğü gibi commands kök (root) elementidir. İçerisinde iki tane komut vardır. Komutlarında parametreleri vardır ve p etiketi ile verilmiştir. Java sınıfları aşağıdaki gibidir. Paramtre sınıfı :
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import org.apache.commons.lang3.builder.ToStringBuilder;
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Parameter {
private String name;
private String type;
private boolean required;
public Parameter() {}
public Parameter(String name, String type, boolean required) {
super();
this.name = name;
this.type = type;
this.required = required;
}
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@XmlAttribute(name = "required")
public boolean isRequired() {
return required;
}
public void setRequired(boolean required) {
this.required = required;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
Komut için sınıf :
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang3.builder.ToStringBuilder;
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Command {
private String key;
private List<Parameter> parameters;
public Command() {
}
public Command(String key, List<Parameter> parameters) {
super();
this.key = key;
this.parameters = parameters;
}
@XmlAttribute
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@XmlElement(name = "p")
public List<Parameter> getParameters() {
return parameters;
}
public void setParameters(List<Parameter> parameters) {
this.parameters = parameters;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
En son da ana sınıfı tanımlayalım :
import java.io.File;
import java.util.Collections;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.commons.lang3.builder.ToStringBuilder;
@XmlRootElement (name = "commands")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Commands {
private List<Command> commands;
public Commands() {
}
public Commands(List<Command> commands) {
super();
this.commands = commands;
}
@XmlElement(name = "command")
public List<Command> getCommands() {
return commands;
}
public void setCommands(List<Command> commands) {
this.commands = commands;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
Bu sınıflar yaratıldığı için artık XML'den sınıfı yüklüyebiliriz :
public static void main(String[] args)
throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Commands.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Commands commands= (Commands) jaxbUnmarshaller.unmarshal(
new File("D:\\commands.xml"));
System.out.println(commands);
}
Burada bir klasör içindeki XML yüklenmektedir. Commands'ı ekrana bastırdığınızda XML'den bilgilerin yüklendiğini ekranda göreceksiniz.
public class XmlOutputPropertyTest {
public static void main(String[] args)
throws UnsupportedEncodingException,
TransformerFactoryConfigurationError, TransformerException {
String xml="<test><message id=\"123\"><b>World</b></message><detail>Detay bilgisi burada</detail></test>";
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // xml declarasyonu istemiyoruz
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
StringReader reader=new StringReader(xml);
StreamSource source =new StreamSource(reader);
StreamResult result= new StreamResult(new OutputStreamWriter(System.out, "UTF-8"));
transformer.transform(source , result);
}
}
Bu uygulama çalıştığında standart output (çıktı) ekranında XML biçimli bir şekilde gözükecektir :
<test>
<message id="123">
<b>World</b>
</message>
<detail>Detay bilgisi burada</detail>
</test>
XML'i biçimlenmesi aşağıdaki kod bölümü sağlamaktadır :
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // xml declarasyonu istemiyoruz
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Eğer bu satırları yorum haline getirip tekrar çalıştırırsak çıktı aşağıdaki gibi olacaktır :<?xml version="1.0" encoding="UTF-8"?> <test> <message id="123"><b>World</b></message> <detail>Detay bilgisi burada</detail> </test>