[ y0gie @ 14.05.2003. 15:17 ] @
Može mi li neko reči kako mogu da manipuliram sa XML DOM dokumentom u Javi ?
Treba mi da stavim podatke iz xml-fajla u ArrayList. Ali moram da znam hierarhiju xml-ja kako bi mogo da to napravim. Znam kako da stavim ceo XML dokument u Document i kako da ostvarim NodeList. ali dalje mi neide.

xml izgleda nekako ovako:

<books>
<book>
<link>www.nekilink.com</link>
<delimiters>
<left>neki text</left>
<right>neki drugi text</right>
</delimiters>
</book>

<book>
<link>www.nekilink.com</link>
<delimiters>
<left>neki text</left>
<right>neki drugi text</right>
</delimiters>
<delimiters>
<left>neki text</left>
<right>neki drugi text</right>
</delimiters>
<delimiters>
<left>neki text</left>
<right>neki drugi text</right>
</delimiters>
</book>

a na kraju meni treba ovakva struktura:
ArrayList link = new ArrayList();
link(www.nekilink.com) -> delimiters
link(www.nekidrugilink.com) -> delimiters, delimiters, delimiters

Struktura nije problem, nego kako staviti podatke u strukturu.

Hvala
[ bunker @ 15.05.2003. 11:44 ] @
bas se ovih dana zezam sa DOM-om u javi, pa mozda mogu da ti pomognem.

za pocetak mi nije najjasniji tvoj xml, ali...

ako si vecc dosao do NodeList objekta, onda izvuci jedan po jedan element iz njega. za ono sto je izmedju tagova koristis Node#getNodeValue() metod, ali mislim da dokument mora biti opisan DTD-om da bi tako nesto izveo. u suprotnom objekat node necce vratiti svoju vrednost. Kako sam nesto malo gledao u javaDocs element ciju vrednost trazis mora biti definisan tipom CDATA.

ovo ne vazi za atribut elementa. njega mozes dobiti uvek pozivajuci metod Element#getAttribute(attrName)...

malo je rano. ajde pojasni jos sta ti treba, ako stignes do 15:00, pa ccu ti pomocci koliko mogu...


pozdrav
[ y0gie @ 15.05.2003. 12:43 ] @
Napiso sam več program ali ovakvo programiranje nije baš najbolje. Radi čak i pravilno. Hteo bih to napraviti malo elegantnije, zato što ako bi mi trebalo kasnije nešto...I ne mogu da vjerujem da je to jedini način da se čita xml. Ako je, onda java i xml baš i nista primerna nizašta nego prenos s jedne platforme na drugu.

// reading XML into data structure
public ArrayList read(String path) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Document document = parser.parse( path );
Element books = document.getDocumentElement();
NodeList listBooks = books.getElementsByTagName("book");

ArrayList links = new ArrayList();
ArrayList linksArray = new ArrayList();
ArrayList lrstruct = new ArrayList();
String link = "";

for (int i=0; i<listBooks.getLength(); i++)
{
NodeList child = listBooks.item(i).getChildNodes();
linksArray = new ArrayList();
for (int j=0; j<child.getLength(); j++)
{
links = new ArrayList();

if (child.item(j).getNodeName().equals("link") && child.item(j).hasChildNodes()) {
Node textlink = child.item(j).getFirstChild();
link = (String)textlink.toString();
}
if (child.item(j).hasChildNodes() && child.item(j).getNodeName().equals("delimiters")) {
String left="";
String right = "";
boolean leftrule = false;
NodeList firstchild = child.item(j).getChildNodes();
boolean zezapisano = false;
for (int k=0; k<firstchild.getLength(); k++)
{
boolean flag = false;
if (firstchild.item(k).hasChildNodes()) {
Node nl = firstchild.item(k).getFirstChild();
if (zezapisano == true && nl.getNodeValue() != null && nl.getNodeValue() != "") {
right = nl.getNodeValue();
}
if (zezapisano == false && nl.getNodeValue() != null && nl.getNodeValue() != "") {
left = nl.getNodeValue();
zezapisano = true;
}
}
}
LR lr = new LR();
lr.L = left;
lr.R = right;
links.add(lr);
}
if (!links.isEmpty()) {
linksArray.add(links);
}
}
LRstruct LRs = new LRstruct();
LRs.link = link;
LRs.rules = linksArray;
lrstruct.add(LRs);
}

return lrstruct;
}