Errore nell'Header del formato XML

Buongiorno a tutti …
Sto cercando di imparare ad utilizzare il formato XML ;
Per il momento sono in fase di ‘Scrittura’ …
Ho un problema sulla testata o root del formato …

In pratica vorrei ottenere :

<?xml version="1.0" encoding="UTF-8"?> <p:FatturaElettronica versione="1.1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://www.fatturapa.gov.it/sdi/fatturapa/v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Ma con il codice che ho scritto :

Dim xml As New XmlDocument dim root as XmlNode root = xml.AppendChild(xml.CreateElement("p:FatturaElettronica")) root.SetAttribute("versione","1.1") root.SetAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#") root.SetAttribute("xmlns:p","http://www.fatturapa.gov.it/sdi/fatturapa/v1.1") root.SetAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")

Ottengo un errore perch questo parametro p:FatturaElettronica non funziona e mi genera errore “msg:invalid namespace prefix ‘p:FatturaElettronica’”

 root = xml.AppendChild(xml.CreateElement("p:FatturaElettronica"))

Come posso fare in modo di passare il parametro correttamente ‘p:FatturaElettronica’
Grazie per l’aiuto.
Massimiliano.

Prova con questo codice:

Dim xml As New XmlDocument
  dim root as XmlNode
  root = xml.AppendChild(xml.CreateElement("http://www.fatturapa.gov.it/sdi/fatturapa/v1.1", "p:FatturaElettronica"))
  root.SetAttribute("versione","1.1")
  root.SetAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#")
  root.SetAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")

In pratica la prima volta che usi un elemento con il name space (in questo caso p per elemento FatturaElettronica) devi anche dichiarare l’URI del name space. Automaticamente verr inserito il xmlns:p.
Gli altri (ds as esempio) gli inserisci come attributi e dopo potrai inserire normalmente gli elementi senza dover dichiarare il name space.

Il problema alla fine ti si pone solo per il namespace del contenitore principale.

… fai bene ad imparare ad utilizzare il formato XML, la fattura elettronica verr presto estesa a tutti non solo alla relazione con la PA

Hai ragione Antonio … proprio cos, infatti mi st preparando appunto all’evento;
Detto questo, risolto il problema e emissione fattura pa completato, il file xml dopo aver fatto le verifiche sul sito ‘http://www.fatturapa.gov.it’ compatibile e funzionante.

Adesso devo leggere il file che arriva da terzi;
Il file XML composto da due Nodi : FatturaElettronicaHeader e FatturaElettronicaBody
E questi Nodi sono suddivisi da altri Nodi , anche essi da altrettanti nodi ;

Per la lettura possibile recuperare il valore ‘textnode’ di un elemento richiamandolo per nome ?

Diciamo che lo devi leggere un po come quando navighi utilizzando un folder item.

Hai due strade possibili.
Poniamo che un documento con questa struttura:

<DOC>
   <HEADER>
       <NODOA>Io sono A</NODOA>
       <NODOB>Io sono B</NODOB>
   </HEADER>
   <BODY>
      <NODOALFA>Io sono Alfa1</NODOALFA>
      <NODOALFA>Io sono Alfa2</NODOALFA>
      <NODOBETA>
          <BETA>Io sono Beta</BETA>
      </NODOBETA>
   </BODY>
</DOC>

Leggi il documento con:

dim x as new xmlDocument x.loadXML(------il documento----)

parti dalla radice con
dim root as xmlNode=x.documentElement

Ora o scorri ogni elemento per livello e analizzi all’interno della sezione (ad esempio)

dim xPadre as XmlNode=root.firstChild if xPadre<>nil then //esiste un figlio di DOC if xPadre.name="HEADER" then leggiHeader(xPadre) if xPadre.name="BODY" then leggiBody(xPadre) xPadre=xPadre.NextSibling end if

E in ogni analisi ripeti la cosa considerando che i nodi di testo (Io sono A, ad esempio) sono di tipo 3 (textNode)

Altrimenti vai per percorsi:

dim xNodeList as XmlNodeList=root.xql("BODY/NODOALFA")

avrai ora la lista di tutti i nodi NODOALFA che sono sotto BODY che sono nel documento (root)

Se non ti interessa leggere attributi ma solo il testo puoi scrivere:

xNodeList=root.xql("BODY/NODOALFA/text()")

La lista di nodi in xNodeList sar il risultato di quanto stai cercando. Puoi partire da qualsiasi nodo a te noto e indicare il “percorso” a partire da li (attento che se vedi in giro gli esempi per qualche strano motivo partono sempre dal sopra root, non si sa perch).
Controlla sempre se la lista vuota (length=0 in quel caso) e per scorrere tra gli elementi usi gli item
ad esempio:

dim n as integer=xmlNodeList.length-1 dim msg() as string for i as integer=0 to n msg.append xmlNodeList.item(i).value next

In questo modo hai un vettore di tutti i testi degli elementi NODOALFA in BODY.

Questo mi pare quello che mi serve …
xNodeList=root.xql(“BODY/NODOALFA/text()”)

se omesso cosa ritorna ? NIL o provoca un errore ?

Ops mi sono accorto adesso…

Perch i parametri finiscono nel primo child ??

<?xml version="1.0" encoding="UTF-8"?>

<p:FatturaElettronica xmlns:xml=“http://www.w3.org/XML/1998/namespace” versione=“1.1”>

[quote=247601:@Massimiliano Chiodi]Questo mi pare quello che mi serve …
xNodeList=root.xql(“BODY/NODOALFA/text()”)

se è omesso cosa ritorna ? NIL o provoca un errore ?[/quote]
Non lo trova (tu cerchi esattamente dal punto di partenza tutti i nodi BODY seguiti da nodi NODOALFA seguiti da un nodo testo. Se non c’è non lo trovi…

[quote=247610:@Massimiliano Chiodi]Ops mi sono accorto adesso…

Perchè i parametri finiscono nel primo child ??

<?xml version="1.0" encoding="UTF-8"?>

<p:FatturaElettronica xmlns:xml=“http://www.w3.org/XML/1998/namespace” versione=“1.1”>
[/quote]
Dovresti postare il codice con cui crei il nodo p:FatturaElettronica e FatturaElettronicaHeader

Da qualche parte dovrei avere un costruttore conforme per queste fatture, l’avevo fatto una sera quando erano uscite le specifiche.

… ma non avevi detto che il documento era stato accettato??

Me lo aveva accettato ancora quando avevo modificato manualmente l’header del file xml,
Dopo aver inserito le modifiche da te suggerite ottengo l’errore.

[code]<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica xmlns:xml=“http://www.w3.org/XML/1998/namespace”>




[/code]

L’unico errore che il file xml viene ritenuto con ‘formato errato’ proprio solo per l’header;

Dim xml As New XmlDocument dim root as XmlNode root = xml.AppendChild(xml.CreateElement("http://www.fatturapa.gov.it/sdi/fatturapa/v1.1","p:FatturaElettronica")) root.SetAttribute("versione","1.1") root.SetAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#" ) root.SetAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance") header della fattura elettronica Dim FatturaElettronicaHeader As XMLNode FatturaElettronicaHeader = root.AppendChild(xml.CreateElement("FatturaElettronicaHeader")) // Dati di trasmissione Dim DatiTrasmissione as XmlNode DatiTrasmissione = FatturaElettronicaHeader.AppendChild(xml.CreateElement("DatiTrasmissione")) // Dati del trasmittente Dim IdTrasmittente as XmlNode IdTrasmittente = DatiTrasmissione.AppendChild(xml.CreateElement("IdTrasmittente"))

qui la prima parte del codice…

Strano, ho ripreso il progetto relativo e non riscontro quanto dici.
Ti riporto il codice della generazione dell’XML

//Oggetto fatturaPA metodo XML->XmlDocument del documento
dim x as new XmlDocument
x.AppendChild x.CreateElement ("http://www.fatturapa.gov.it/sdi/fatturapa/v1.1","p:FatturaElettronica")
x.DocumentElement.SetAttribute "xmlns:ds","http://www.w3.org/2000/09/xmldsig#"
x.DocumentElement.SetAttribute "xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"
 
versione.xml x.DocumentElement   //versione  una propriet della fattura di tipo fatturaPAVersioneSchemaType
header.XML x.DocumentElement   //header  un propriet della fattura di tipo fatturaPAHeader
//prosegue con i resto....   
Return x


----
fatturaPAVersioneSchemaType metodo XML: 
Sub XML(x as XmlElement)
  x.SetAttribute "versione","1.1"
End Sub
----
fatturaPAHeader metodo XML: 
Sub XML(node as XmlElement)
  dim doc as XmlDocument=node.OwnerDocument
  dim f as XmlElement=doc.createElement("FatturaElettronicaHeader")
  node.AppendChild f
//seguono chiamate ai sotto nodi (ad esempio trasmissione, cedente etc, con i relativi metodi XML
// a cui passo il nodo corrente, quindi in pratica stessa struttura base
 
End Sub

Il risultato della chiamata diventa quindi:

[code]

<?xml version="1.0" encoding="UTF-8"?>

<p:FatturaElettronica xmlns:p=“http://www.fatturapa.gov.it/sdi/fatturapa/v1.0” xmlns:ds=“http://www.w3.org/2000/09/xmldsig#” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” versione=“1.1”>









</p:FatturaElettronica>[/code]

Un suggerimento, anche se non mi sembra la causa del tuo problema, quello di impostare un oggetto per ogni tipo di informazione in modo da creare correttamente il frammento di XML relativo e impostare anche la verifica dei parametri come da WSDL.

Finito anche la lettura …
Cos’ una volta caricato il file XML eseguo queste operazioni …

se codice fiscale e/o partita iva non corrispondondono a nessun fornitore creo l’anagrafica
se il documento contiene degli articoli ( quindi una cessione di beni )
se l’articolo corrisponde per il codice articolo del fornitore quindi inserisco un documento di carico ( fattura accompagnatoria) o fattura d’acquisto selezionando manualmente l’ordine in evasione. Registrando il documento genero in automatico le scadenze, e la prima nota dell’acquisto ;
se il documento relativo ad una prestazione ( quindi una prestazione di servizi ) carico la prima nota e lo scadenziario …

Per effettuare la lettura dell’XML ho creato una funzione che mi ha permesso di fare tutto in poco tempo …

[code]Function xmlnoderead(nodo as XmlNode, query as string) As string
if nodo = nil then Return “”
if query.trim = “” 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
[/code]