Estrapolare dati da un Xml /2

Ciao a tutti, nel mio precedente post mi avete dato le dritte giuste per estrapolare i dati da un file xml di fattura elettronica tipo Partita Iva, Ragione Sociale e cosi via.
Ora per dovrei estrapolare l’elenco delle voci.
Come posso muovermi?

Non molto diverso.
La nodeList la fai rispetto alla nodo che contiene le voci.
Poi iteri sui singoli nodi trovati e fai fai una XQL sul nodo corrente (ricordandoti che parti da quel nodo) cercando le informazioni che ti servono.

ma, per esempio,
se per sapere l’id paese ho assegnato a mKey questo valore
mKey = “//CedentePrestatore//DatiAnagrafici//IdFiscaleIVA//IdPaese//text()”
ora, per sapere il codice articolo della riga 2
vorrei le stesse istruzioni usando una cosa del genere
mKey = “//DatiBeniServizi//DettaglioLinee//NumeroLinea//CodiceArticolo//CodiceTipo//text()”
ovviamente per dovrei fargli fare la ricerca solo nel nodo della seconda riga.
non c’ modo di assegnare a mKey un valore che punti direttamente al codice articolo della riga due senza dover “navigare” tra i nodi alla ricerca di quello giusto?

La navigazione dovrebbe essere locale (dall’ultimo nodo comune), non generale (partendo sempre dall’origine)

Nulla Antonio … gli ho passato un po’ delle informazioni che mi avevi girato un paio di anni fa.
Mi riferisce che ha risolto
in pratica gli ho fatto dividere i vari nodi

Una funzione per estrarre il singolo nodo

Public Function xmlnoderead(nodo as XmlNode, query as string) as string
  if nodo = nil then Return ""
  if query.evuoto then Return ""
  
  dim stringa as string
  dim lettura as XmlNode
  dim lista as XmlNodeList
  lista = nodo.Xql(query.trim + "/text()")
  if lista = nil  or lista.Length = 0 then Return ""
  if lista.Item(0) = nil then Return ""
  lettura = lista.Item(0)
  stringa = lettura.Value
  return stringa
End Function

Una funzione per estrarre una lista di nodi

[code]Public Function xmlnodereadlist(nodo as XmlNode, query as string) as XmlNode()
dim arrayvuoto() as XmlNode
if nodo = nil then Return arrayvuoto()
if query.evuoto then Return arrayvuoto()

dim lettura as XmlNode
dim lista as XmlNodeList
dim listanodo() as XmlNode
dim contatore as Integer
dim elementi as integer
lista = nodo.Xql(query.trim)
if lista = nil or lista.Length = 0 then Return arrayvuoto()
if lista.Item(0) = nil then Return arrayvuoto()
elementi = lista.Length
for contatore = 0 to elementi -1
listanodo.Append(lista.Item(contatore))
next
lettura = lista.Item(0)
return listanodo()
End Function[/code]

La spiegazione su come dividere i 6 nodi principali della fattura
ed estrarre cos il dettaglio delle righe
per ricavare DatiBeniServizi per usare la funzione del primo codice
dettagliolinee() = xmlnodereadlist(DatiBeniServizi,“DettaglioLinee”)
ho fatto cos :

// Nodi 
dim DatiTrasmissione as XmlNode
dim CedentePrestatore as XmlNode
dim CessionarioCommittente as XmlNode
dim DatiGenerali as XmlNode
dim DatiBeniServizi as XmlNode
dim DatiPagamento as XmlNode

// sono i nodi delle 6 sezioni della fattura elettronica ...

dim numerofigli_FatturaElettronicaHeader as integer
dim numerofigli_FatturaElettronicaBody as integer
numerofigli_FatturaElettronicaHeader = xml.FirstChild.Child(0).ChildCount
numerofigli_FatturaElettronicaBody = xml.FirstChild.Child(1).ChildCount
dim contatore as Integer
for contatore = 0 to numerofigli_FatturaElettronicaHeader - 1
  select case xml.FirstChild.Child(0).Child(contatore).Name
  case "DatiTrasmissione"
    DatiTrasmissione = xml.FirstChild.Child(0).Child(contatore)
  case "CedentePrestatore"
    CedentePrestatore = xml.FirstChild.Child(0).Child(contatore)
  case "CessionarioCommittente"
    CessionarioCommittente = xml.FirstChild.Child(0).Child(contatore)
  end select
next

for contatore = 0 to numerofigli_FatturaElettronicaBody - 1
  select case xml.FirstChild.Child(1).Child(contatore).Name
  case "DatiGenerali"
    DatiGenerali = xml.FirstChild.Child(1).Child(contatore)
  case "DatiBeniServizi"
    DatiBeniServizi = xml.FirstChild.Child(1).Child(contatore)
  case "DatiPagamento"
    DatiPagamento = xml.FirstChild.Child(1).Child(contatore)
  end select
next

Ed alla fine la lettura delle righe

dim dettagliolinee() as XmlNode
dettagliolinee() = xmlnodereadlist(DatiBeniServizi,"DettaglioLinee")
numeroelementi = dettagliolinee.Ubound
for contatore = 0 to numeroelementi 
   // ... qui ci metti il codice per leggere le righe 

  dim NumeroLinea as string = xmlnoderead(dettagliolinee(contatore),"NumeroLinea")
  lbrighe.cell(lbrighe.ListCount - 1,0) = NumeroLinea
  dim tipocessione as string = xmlnoderead(dettagliolinee(contatore),"TipoCessionePrestazione")
  dim codicetipo as String = xmlnoderead(dettagliolinee(contatore),"CodiceArticolo/CodiceTipo")
  dim codicevalore as string = xmlnoderead(dettagliolinee(contatore),"CodiceArticolo/CodiceValore")
  lbrighe.Cell(lbrighe.ListCount - 1,1) = codicevalore
  lbrighe.celltag(lbrighe.ListCount -1,1) = codicetipo
  dim descrizione as string = xmlnoderead(dettagliolinee(contatore),"Descrizione")
  dim quantita as currency = xmlnoderead(dettagliolinee(contatore),"Quantita").val
  dim unitamisura as string = xmlnoderead(dettagliolinee(contatore),"UnitaMisura")
  dim prezzounitario as currency = xmlnoderead(dettagliolinee(contatore),"PrezzoUnitario").val
  // sconto / maggiorazione lo mettiamo dopo
  dim prezzototale as Currency = xmlnoderead(dettagliolinee(contatore),"PrezzoTotale").val
  dim aliquotaivarigo as currency = xmlnoderead(dettagliolinee(contatore),"AliquotaIVA").val
 
next 

Riporto il codice, se serve a qualcun’altro, magari non scritto proprio bene bene ma funziona.