Transcript 5. XML DOM
http://www.w3schools.com/dom/
Dr. Galip AYDIN
DOM
bir W3C (World Wide Web
Consortium) standardıdır
XML ve HTML gibi dokümanlara erişim
için standart bir yol tanımlar
"The W3C Document Object Model (DOM)
is a platform and language-neutral
interface that allows programs and scripts
to dynamically access and update the
content, structure, and style of a
document."
DOM
standart modeller tanımlayan 3
farklı parça/seviye içerir
• Core DOM: Herhangi bir yapısal doküman için
• XML DOM: XML dokümanları için
• HTML DOM: HTML Dokümanları için
XML için
• standart bir nesne modeli
• Standart bir programlama arayüzü
• Platform ve dilden bağımsız
XML DOM bütün XML elementleri
için
nesne ve özellikleri ve bunlara erişim
için gerekli metodları (arayüzler)
tanımlar
Diğer bir deyişle DOM, XML
elementlerine erişim, değiştirme, ekleme,
silme gibi işlemler için bir standart
sağlar.
DOM
açısından XML içindeki herşey bir
düğümdür (node)
• Dokümanın kendisi doküman düğümüdür
• Her bir xml elementi bir element düğümüdür
• XML elementlerinin içindeki yazılar yazı
düğümüdür (text node)
• Herbir nitelik (attribute) nitelik düğümüdür
• Yorum düğümleri de bulunabilir
Düğüm
ağacındaki her bir düğümün
diğerleriyle hiyerarşik bir ilişkisi vardır
Bu ilişkileri anlatmak için ebeveyn, çocuk
ve kardeş (parent, children, siblings)
terimleri kullanılır
Ebeveyn düğümlerin çocukları vardır
Aynı seviyedeki çocuklar kardeş (kız
veya erkek) olarak adlandırılırlar
Bir
düğüm ağacında en tepedeki düğüme
kök denir
Kök düğüm hariç her düğümün sadece
bir ebeveyni vardır
Bir düğümün sınırsız sayıda çocuğu
olabilir
Çocuğu olmayan düğümlere yaprak denir
Aynı ebeveyne sahip, aynı seviyedeki
düğümlere kardeş denir
XML
dokümanlarını ayrıştırmak için
kullanılan çeşitli uygulamalar (parser)
yazılmıştır
XML DOM modeli elemanlara erişim,
değiştirmek, silmek veya eklemek için
metotlar içerir ancak öncelikle
dokümanın DOM nesnesine yüklenmesi
gerekir
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else // IE 5/6
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET","books.xml",false);
xhttp.send();
xmlDoc=xhttp.responseXML;
x.nodeName
– x düğümünün ismi
x.nodeValue - x düğümünün değeri
x.parentNode - x düğümünün ebeveyn
düğümü
x.childNodes - x düğümünün çocukları
olan düğümler
x.attributes - x düğümünün nitelikleri
x.getElementsByTagName(name)
–
verilen isimdeki bütün elementleri getir
x.appendChild(node) – x düğümüne bir
çocuk düğüm ekle
x.removeChild(node) – x düğümünden
verilen düğümü sil
<script type="text/javascript">
xmlDoc=loadXMLDoc("books.xml");
x=xmlDoc.getElementsByTagName("book")[0].childNodes;
y=xmlDoc.getElementsByTagName("book")[0].firstChild;
for (i=0;i<x.length;i++)
{
if (y.nodeType==1)
{//Process only element nodes (type 1)
document.write(y.nodeName + "<br />");
}
y=y.nextSibling;
}
</script>
<script type="text/javascript">
text="<book>";
text=text+"<title>Everyday Italian</title>";
text=text+"<author>Giada De
Laurentiis</author>";
text=text+"<year>2005</year>";
text=text+"</book>";
xmlDoc=loadXMLString(text);
// documentElement always represents the root
node
x=xmlDoc.documentElement.childNodes;
for (i=0;i<x.length;i++)
{
document.write(x[i].nodeName);
document.write(": ");
document.write(x[i].childNodes[0].nodeVal
ue);
document.write("<br />");
}
</script>
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
DOM4J
• http://dom4j.sourceforge.net/
JDOM
• http://www.jdom.org/
Apache
…
XML projeleri
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Foo {
}
public Document parse(URL url) throws DocumentException
{
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
// iterate through child elements of root
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// iterate through child elements of root with element name "foo"
for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
Element foo = (Element) i.next();
// do something
}
}
// iterate through attributes of root
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
public void treeWalk(Document document) {
treeWalk( document.getRootElement() );
}
public void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
treeWalk( (Element) node );
}
else {
// do something....
}
}
}
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
SAX
DOM’a alternatif olarak geliştirilmiş bir
sıralı erişim ayrıştırıcısıdır (parser).
XML dokümanlarını okumak için gerekli
araçları sağlar.
SAX olay-güdümlü (event-driven) olarak
çalışan akışa göre çalışan (stream-parser)
bir ayrıştırıcıdır.
SAX ayrıştırıcısı karşılaştığı düğümleri
sırasıyla işler (event), ve bu işleme
dokümanın sonuna kadar devam eder.
SAX DOM’a göre daha küçük hafızaya
ihtiyaç duyar. Özellikle büyük XML
dokümanlarının işlenmesinde bu büyük bir
avantajdır.
DOM parser tüm XML ağacının hafızaya
yüklenmesine gereksinim duyar.
Olay-güdümlü yaklaşım dolayısıyla SAX
parser DOM’a göre genellikle daha hızlıdır.
XSLT ve XPATH gibi bazı teknolojiler tüm
XML ağacına ihtiyaç duydukları için SAX
parser kullanamazlar.
Araştırın
!
sjsxp
Woodstox
Aalto