Newsgroup: it.comp.lang.visual-basic
Titolo: xml con visual basic 6

Salve volevo sapere come fare a leggere un file xml formato in questa 
maniera
<?xml version="1.0" encoding="iso-8859-1"?>
 <tag1>
  <tag2>
    <tag3>
      <file1=1  descrizione immagine="imm1.jpg"   \>
      <file2=2  descrizione immagine="imm2.jpg"    \>
    </tag3>
  </tag2>
 </tag1>
In pratica io vorrei riuscire a mettere in una listbox numero e
descrizione 
l'immagine corrispondente di fianco e sotto la descrizione (per intenderci 
vorrei fare una sorta di catalogo che visualizzi l'immagine e la
descrizione 
della selezione )
Ciao e grazie
Ps. Vi chiedo se qualcuno puņ aiutarmi o almeno indirizzarmi verso qualche 
esempio inquanto mi trovo incasinato ad avere
<file1=1  descrizione immagine="imm1.jpg"   \>
e non
<file1> descrizione immagine="imm1.jpg"<\file1> 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

L'XML che riporti è sbagliato.
Prova con:
<file id="1" descrizione="la descrizione che vuoi" immagine="imm1.jpg"
/>
Ciao.

 Ciao.
Il problema non č come č formato l'xml (si hai ragione č cosě formato) ma
vorrei un esempio o uno stralcio di codice che mi permetta di leggere
all'in terno di quel xml i campi che mi servono..Mi puoi aiutare?
CIao


       <file1=1  descrizione immagine="imm1.jpg"   \>
Questa linea ha tre errori al prezzo di due: primo, un tag name non e' un
attributo, ed in quanto tale non puo' avere un valore. Secondo, un nome
attributo non puo' contenere spazi. Terzo (derivato dall'interpretazione
letterale del codice), gli attributi devono avere un valore (hai detto al
parser che c'e' un attributo "descrizione", ma non gli hai fornito alcun
valore).
Oltre all'usare la forma indicata da ma81x, suggerisco anche encoding utf-8
anziche' iso-8859-1, tanto lo manipoli comunque con l'xml parser MS, che ti
fa la conversione da solo in ambo i sensi, quindi non ti costa nulla e ti
semplifica la vita quando devi trattare caratteri strani.
Ciaotutti,
* - che ha ancora gli incubi in greco

 servono..Mi puoi aiutare?
http://www.google.com/search?num=50&hl=en&lr=&biw=971&q=microsoft+xml+parser+example+visual+basic
Questo e' bello completo:
http://www.topxml.com/xml/articles/xmlvbasp/
Alla fine ci trovi esempi di codice.
HTH,
*

 *
Quindi lasciando stare per un attimo com'è formato l'xml (ce l'ho già il
file..ho sbagliato io a scriverne il contenuto visto che l'ho fatto a
memoria e non l'avevo sotto mano..)mi interessa proprio la parte di codice
cioè librerie.. oggetti e tutto quello che devo caricare.Insomma un
esempio di come fare in Visual basic a fargli leggere quel file xml e
trovare i campi


 <file1> descrizione immagine="imm1.jpg"<\file1>
http://msdn.microsoft.com/xml
Troverai tutto quello ti serve  (documentazione, materiale, esempi).
Ciao!
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca


Ciaotutti,
* - e le risposte retroattive

 Scusami per la domanda stupida...
Beh, se ti rendo conto da solo che la domanda è stupida, perchè non ci hai 
ragionato un pochino sopra???
Se "AntMovieCatalog/Catalog/Contents/Movie[@Number=1]" è una stringa cosa 
c'e' di più semplice di una concatenazione?
"AntMovieCatalog/Catalog/Contents/Movie[@Number=" & tuaVariabile & "]"
Oppure, altro sistema
dim sQuery as string
dim sToken as string
sQuery = "AntMovieCatalog/Catalog/Contents/Movie[@Number=$$]"
sToker = "$$"
 oXMLDom.selectNodes(Replace(sQuery,sToken,TuaVariabile))


 ciao!
Grazie questa soluzione forse mi va bene perchè ora quando seleziono un
film dal listbox voglio visualizzare le informazioni specifiche dentro a
un textbox in questo modo posso farlo
Grazie



Ciaotutti,
* - e leggilo tutto quel link

 *
Ho modificato If x.childNodes.length Then perchč avevi messo
x.children.length e non andava..ora si ferma su errore run-time 91
:Variabile oggetto o variabile del blocco With non impostata. e l'errore
lo da su If x.childNodes.length Then
Dim n As IXMLDOMNode
Dim oXMLDom As New MSXML2.DOMDocument
Dim oNode As IXMLDOMNode
Private Sub Form_Load()
oXMLDom.Load (App.Path & "/prova.xml")
For Each oNode In oXMLDom.childNodes
AddElementFromXML n
Next
End Sub
Sub AddElementFromXML(ByRef x As IXMLDOMNode)
Dim n As IXMLDOMNode
If x.baseName = "Movie" Then
' Aggiungi l'elemento alla list box come d'uso
Text1 = "BBBB"
Else
If x.childNodes.length Then
For Each n In x.childNodes
AddElementFromXML n
Next
End If
End If
End Sub



A parte l'indentazione a canazzo,
For Each xmlChildNode In xmlDoc.documentElement.childNodes
Cioe', cosi'? Senza nemmeno controllare che l'elemento sia del tipo giusto?
Comincia ad accertarti di non stare lavorando su qualcos'altro... Una bella


 ciao!
Ho controllato..nel secondo caso il nodo č  <Catalog> come dovrei fare a
passare sul nodo Movie? (scusate se sono cose elementari ma č da poco che
mi son avvicinato a vb e sopratutto a xml)
Invece per  il fatto di tutto sulla stessa riga avevi ragione ho risolto.


 esiste e gli sputa in un occhio.
Si, sono perfettamente d'accordo, ma volevo vedere se ci arrivava da solo 
;)
Comunque, il codice migliore è quello che fa uso delle query Xpath, come 
quello qui sotto
    Dim oXMLDom As New MSXML2.DOMDocument
    oXMLDom.Load ("c:\film.xml")
    Dim oNodeList As IXMLDOMNodeList
    Dim oNode As IXMLDOMNode
    Dim oNodeAttributes As IXMLDOMNamedNodeMap
    Set oNodeList = 
oXMLDom.selectNodes("AntMovieCatalog/Catalog/Contents/Movie")
    For Each oNode In oNodeList
        'sample node
        '<Movie Number="1" Checked="True" Date="21/06/2005" Rating="8.5" 
OriginalTitle="The Matrix" />
        Set oNodeAttributes = oNode.Attributes
        Debug.Print "Movie number: " & 
oNodeAttributes.getNamedItem("Number").nodeValue
        Debug.Print "Checked: " & 
oNodeAttributes.getNamedItem("Checked").nodeValue
        Debug.Print "Date: " & 
oNodeAttributes.getNamedItem("Date").nodeValue
        Debug.Print "Rating: " & 
oNodeAttributes.getNamedItem("Rating").nodeValue
        Debug.Print "OriginalTitle: " & 
oNodeAttributes.getNamedItem("OriginalTitle").nodeValue
        Debug.Print "-----"
    Next
Ovviamente la query xpath puo' essere ancor piu' "specifica" come sei 
seguenti esempi:
'trova tutti i nodi dove l'attributo number del nodo Movie è uguale a 1
Set oNodeList = 
oXMLDom.selectNodes("AntMovieCatalog/Catalog/Contents/Movie[@Number=1]")
'trova tutti i nodi dove l'attributo Rating del nodo Movie è maggiore di 8
Set oNodeList = 
oXMLDom.selectNodes("AntMovieCatalog/Catalog/Contents/Movie[@Rating>8]")
o ancora
Set oNodeList = oXMLDom.selectNodes("//Movie[@Rating>8]")
facendo una ricerca ricorsiva senza specificare il path completo


 impostare per portarmi sul Movie?


>> Alla fine ci trovi esempi di codice.
Ciaotutti,
* - "third time's the charm"

 Ciaotutti,

Allora Io volevo poter leggere un file xml da usare come catalogo per dei
film..
Se uso un xml così formato
  <Contents>
   <Movie Number="1" 
   Checked="True" 
   Date="21/06/2005" 
   Rating="8.5" 
   OriginalTitle="The Matrix"/>
   <Movie Number="2" 
   Checked="True" 
   Date="21/06/2005" 
   Rating="6.5" 
   OriginalTitle="The Matrix Reloaded"/>
  </Contents>
Riesco a leggere in questo modo e mettere Number e OriginalTitle nel
listbox..
Private xmlDoc As DOMDocument
Private Sub Form_Load()
Dim xmlChildNode As IXMLDOMNode
   Set xmlDoc = New DOMDocument
   xmlDoc.Load (App.Path & "/prova.xml")
   For Each xmlChildNode In xmlDoc.documentElement.childNodes
   mess = xmlChildNode.Attributes.getNamedItem("Number").Text + " " +
xmlChildNode.Attributes.getNamedItem("OriginalTitle").Text
   lstNames.AddItem mess
   Next
End Sub
Come devo fare per poter leggere invece un xml così formato:
<?xml version="1.0" encoding="iso-8859-1"?>
<AntMovieCatalog Format="35" Version="3.5.0 (2005-05-29)" Date="21/06/2005
21.55.51">
 <Catalog>
  <Properties/>
  <Contents>
   <Movie Number="1" Checked="True" Date="21/06/2005" Rating="8.5"
OriginalTitle="The Matrix"/>
   <Movie Number="2" Checked="True" Date="21/06/2005" Rating="6.5"
OriginalTitle="The Matrix Reloaded"/>
  </Contents>
 </Catalog>
</AntMovieCatalog>
In pratica avere più valori su una stessa riga mi incasina tutto...
Ciao e grazie


 *
Tipo in che modo?
Grazie ancora di tutto
-- 



In uno c'e' un bell'elemento Properties, e lui non controlla mai il
basename, l'XML parser si vede chiedere un named attribute che non esiste e
gli sputa in un occhio.
Ciaotutti,
*

 Grazie ancora di tutto
news:d9bi7g$5ov$
1...@area.cu.mi.it
Una query xpath per estrarre tutti i nodi Movie ti porta tutto a un solo
livello.
In alternativa, la famosa funzione ricorsiva:
Sub AddElementFromXML(ByRef x As IXMLDOMNode)
    Dim n As IXMLDOMNode
    If x.baseName = "Movie" Then
        ' Aggiungi l'elemento alla list box come d'uso
    Else
        If x.children.length Then
            For Each n In x.childNodes
                AddElementFromXML n
            Next
        End If
    End If
End Sub
La chiami come:
Sub Main ' o Command1_Click, o quello che preferisci
    Dim oXMLDom As New MSXML2.DOMDocument
    Dim oNode as IXMLDOMNode
    oXMLDom.Load ("c:\film.xml")
    For Each oNode in oXMLDom.childNodes


 bella funzione ricorsiva e passa la paura.
Beh forse non hai capito che č li che si pianta!...forse manca sa come si
scrive una cosa del genere!
Per una volta che un newbie non chiede codice ma prova a spippolare...eddai
aiutatelo un po di piů!!!!

 x.children.length e non andava..ora si ferma su errore run-time 91
Hai visto il codice che ti ho postato?
ciao!
-- 



L'unico dubbio e' se possano esserci piu' catalog o piu' contents... Non
credo, dato che non ci sono parametri di identificazione, ma
laggentesonostrani. Beh, ok, c'e' anche il dubbio se tutti gli attributi
siano obbligatori, ma la gestione degli errori e' comunque "best practice".
Ciaotutti,
*

 > *




Ho risolto giŕ da solo ti ringrazio tantissimo ora provo ad andare avanti
Ciao


 *
C'è anche  <Catalog>  </Catalog> io mi trovo li... cosa devo impostare per
portarmi sul Movie?
-- 


 Ciao!
Ok... Ciao e grazie


 Ciao e grazie
Il file XML č praticamente lo stesso...
Che problema (errore) riscontri???
Il nodo č sempre "Movie" (in entrami i formati) e gli attributi sono 
identici...
Il fatto che siano uno per riga o tutti su una riga, per l'XML non fa 
alcuna differenza.
ciao!


 Grazie
Ora mi è rimasta solo una perplessità..
Come faccio qui 
'Set oNodeList =
oXMLDom.selectNodes("AntMovieCatalog/Catalog/Contents/Movie[@Number=1]")
a mettere al posto del 1 una variabile??
Scusami per la domanda stupida...
-- 
