7 messaggi dal 04 marzo 2005
Scusatemi, ma sono totalmente nel pallone e non riesco a venirne fuori.

Devo leggere un file XML, estrane i dati e inserirli in un DB, sono riuscito a fare il 99% dei passaggi, ma mi sono accorto che nel file XML alcuni nodi non sono presenti e questo mi sballa tutto il risultato, il codice che sto usando è questo:


<%
Dim objXmlDom
Set objXmlDom = Server.CreateObject("Microsoft.XMLDOM")
objXmlDom.async = False
objXmlDom.load Server.MapPath("public/Prodotti.xml")

Set InternalID= objXmlDom.getElementsByTagName("Product/InternalID")
Set Code= objXmlDom.getElementsByTagName("Product/Code")
Set Description= objXmlDom.getElementsByTagName("Product/Description")
Set AvailableQty= objXmlDom.getElementsByTagName("Product/AvailableQty")

Dim i
i = 0
For i = 0 To InternalID.length - 1
%>

Poi faccio il controllo sull'esistenza del nodo ed è qui che casca l'asino perché il codice non segnala i campi non esistenti, ma sinceramente non ho capito come fare!

<%
Set SupplierName= objXmlDom.getElementsByTagName("Product/SupplierName")
If Not (SupplierName Is Nothing) Then
p_supp=SupplierName(i).Text
Else
p_supp="Altri"
End If
%>

SE potete datemi qualche dritta, ho fatto mille ricerche ma non ci ho capito un gran che!!

Grazie, Roberto
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Roberto,
penso che getElementsByTagName restituisca una lista di nodi, quindi il controllo che dovresti fare nel tuo if è sul numero di elementi che contiene.
Infatti, la lista non potrà mai essere Nothing perché, anche nel caso in cui non esistano nodi "SupplierName", verrà istanziata e la sua proprietà length conterrà il valore 0. Prova così, vediamo se migliora:

<%
Set SupplierName= objXmlDom.getElementsByTagName("Product/SupplierName")
If SupplierName.length > 0 Then
p_supp=SupplierName(0).Text
Else
p_supp="Altri"
End If
%>


ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 04 marzo 2005
Sul campo prezzo mi da questo errore:

Errore di run-time di Microsoft VBScript error '800a01c2'

Numero errato di argomenti o assegnazione di proprietà non valida

import.asp, riga 78


La riga incriminata è questa:

If Netprice2 > 0 Then

Il problema è che in questo caso il nodo non esiste nel file XML, può essere questo il problema?

Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

eproject ha scritto:

La riga incriminata è questa:
If Netprice2 > 0 Then

Controlla meglio, non può essere questa perché è una semplice condizione booleana che non comprende argomenti o assegnazioni, così come come citato dall'errore.

Vedi se per caso è la riga precedente. Magari non hai chiuso una parentesi o i doppi apici di una stringa.

ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 04 marzo 2005
Ho controllato e la riga è proprio quella... ti allego l'immagine dell'errore sulla sinistra e della pagina asp a destra aperta nell'editor, non è che se il nodo non esiste il campo è nullo e quindi va in errore al controllo della lunghezza?

https://dl.dropboxusercontent.com/u/55339522/errore.jpg
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prova con Netprice2.length

If Netprice2.length > 0 Then


eproject ha scritto:

non è che se il nodo non esiste il campo è nullo

Non dovrebbe essere null perché, come ti dicevo in precedenza, la lista verrebbe comunque istanziata, purché priva di qualsiasi elemento.
Valutando la proprietà length, verifichi appunto che contenga elementi.

ciao,
Moreno
Modificato da BrightSoul il 15 aprile 2014 14.19 -

Enjoy learning and just keep making
7 messaggi dal 04 marzo 2005
Ti ringrazio moltissimo per l'aiuto ma non va!
In effetti ora sembra andare ma ottengo lo stesso risultato a cui ero arrivato io e cioè apparentemente funziona, tuttavia facendo un riscontro noto che anche quando un campo non esiste il codice prende il valore del nodo successivo sballando tutta la lettura del file.
Poi arrivato ad un certo punto comunque si blocca.

Guarda un po' qui: https://dl.dropboxusercontent.com/u/55339522/esempio.zip

Per caso puoi indicarmi una buona guida on-line che tratti l'argomento così magari me lo studio meglio?

Grazie ancora!

Roberto
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Roberto,

eproject ha scritto:

Guarda un po' qui

Ok, ho visto il sorgente. Dovresti usare un altro approccio perché, date anche le dimensioni del file xml, l'algoritmo che stai usando è profondamente inefficiente e produce il difetto che hai notato.

Continuando ad invocare getElementsByTagName molteplici volte per ogni iterazione del ciclo, costringi l'oggetto Microsoft.XMLDOM a ri-percorrere da capo l'intero file. Questo non è necessario perché ti basterebbe ottenere un riferimento al nodo Product, e da lì procedere esaminando i suoi nodi figli.

A grandi linee dovresti fare:
'Recupero tutti i nodi Product
Set prodotti = objXmlDom.SelectNodes("//Products/Product")
'Per ogni nodo Product...
For Each prodotto In prodotti
  '...ottengo il suo elemento figlio "InternalID"
  Set InternalID = prodotto.SelectSingleNode("./InternalID")
  'Se esisteva, sarà diverso da Nothing
  If Not InternalID Is Nothing Then
  Response.Write(InternalID.Text & "<br />")
  Else
  Response.Write("InternalID non trovato<br />")
  End If
  
  'Qui prosegui recuperando gli altri nodi figli usando SelectSingleNode come ti ho mostrato
  
Next


eproject ha scritto:

Per caso puoi indicarmi una buona guida on-line che tratti l'argomento così magari me lo studio meglio?

Sì, prova quella di W3Schools.
http://www.w3schools.com/Dom/default.asp

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.