XML'i satir satir okumak diye birsey olamaz, cunku 1000 satirlik bir XML tek satir olarak da yazilabilir. Ornegin:
<root>
<data>
<isim>Ali</isim>
</data>
</root>
ile:
<root><data><isim>Ali</isim></data></root>
ayni XML. Satirdan kastin tablodaki record gibiyse ve XML basit bir XML ise:
Visual Fox Pro
XMLToCursor("xmldosyasi.xml", "cursorAdi", 512)
seklinde bir cursora alip oradan satir satir okuyabilirsin.
Daha karmasik XML'ler icin ise XMLDataAdapter var ya da onu da asiyorsa, MSXML.DOMDocument ile parse edebilirsin.
DOMDocument parse isleminde genel yapi:
Visual Fox Pro
Local xDOM As 'MSXML2.DOMDocument'
xDOM = Newobject('MSXML2.DOMDocument')
xDOM.LoadXML(m.lcXML)
loNodes = xDOM.getElementsByTagName("tagAdi")
For Each loNode In m.loNodes
...
Endfor
Senin < isim > </ isim > gibi taglari bulma isleminde burada tagAdi yerine isim kullanman yeterli, tum isim taglarini bulmus oluyorsun. Eger belli bir elementin altindakiler lazim ise o zaman o nodda getElementsByTagName() kullaniyorsun vs ( xDOM.getElementsByTagName yerine loNode.getElementsByTagName gibi).
Asagidaki ornekte CNN Turk kanalinin rss feedinin XMLDom ile parse edilis ornegi var, neden CNN Turk dersen hicbire fikrim yok, gecmiste nereden esip onu kullandigim hakkinda,
http://www.cnnturk.com/servisler/rss/anasayfa.rss
adresine gidersen bize nasil birsey dondugunu gorursun (eger IE gibi bir browser ile gidersen formatlanmis halini goreceksin 'View source" ile aslinda ne aldigina bak):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>CNN Türk</title>
<link>http://www.cnnturk.com</link>
<description>CNN Türk</description>
<item>
....
</item>
<item>
...
</item>
</channel>
</rss>
gibi bir yapi var. Bizi ilgilendiren buradan < item > < /item > taglarindaki bilgileri alip bir cursor olusturmak:
Local url, lcXML, objHTTP As "MSXML2.XMLHTTP"
url="http://www.cnnturk.com/servisler/rss/anasayfa.rss"
objHTTP = Createobject("MSXML2.XMLHTTP")
objHTTP.Open("GET", m.url,.F.)
objHTTP.Send()
lcXML = objHTTP.ResponseText
Local loDOM As "MSXML2.IXMLDOMDocument"
Local loNodes As "MSXML2.IXMLDOMNodeList"
Local loNode As "MSXML2.IXMLDOMNode"
Local myXML
loDOM = Newobject("MSXML2.DOMDocument.4.0")
loDOM.LoadXML(m.lcXML)
loNodes = loDOM.getElementsByTagName("item")
Set Textmerge To Memvar myXML On Noshow
\\<data>
For Each loNode In loNodes
\ << m.loNode.xml >>
Endfor
\</data>
Set Textmerge To
Set Textmerge Off
Xmltocursor(m.myXML,'myRSS')
* Aldigimiza bakalim
Select myRSS
Browse