Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[OT] file XML e caratteri "speciali"

913 views
Skip to first unread message

Sauro

unread,
May 12, 2016, 7:22:34 PM5/12/16
to
Per l'home banking ho dovuto familiarizzare coi file XML
che non conoscevo.

Ho capito come trattare le vocali accentate e gli altri caratteri
rifiutati da XML come <>&"

Mi trovo in difficoltà col carattere ° molto usato (1° rata,
2° rata, eccetera).
Non viene dichiarato come carattere da rifiutare ma quando
è presente genera errore.

Qualcuno ha forse incontrato e risolto questo problema?

Grazie e saluti.
Sauro


Andrea (Work)

unread,
May 18, 2016, 4:18:45 AM5/18/16
to
Nella mia esperienza si usa qualcosa del genere:
& &#38;
< &#60;
> &#62;
" &#34;
' &#39;

Per cui
Azienda Rossi & Figli Srl
<Nome>Azienda Rossi &#38; Figli Srl</Nome>

Sauro

unread,
May 18, 2016, 8:46:42 AM5/18/16
to

"Andrea (Work)" ha scritto nel messaggio.
Sono d'accordo con te Andrea.
Infatti uso la seguente funzione che gira bene:

Public Function Testo_XML(ByVal T As String) As String
T = Replace(T, "&", "&amp;")
T = Replace(T, "<", "&lt;")
T = Replace(T, ">", "&gt;")
T = Replace(T, Chr$(34), "&quot;")
T = Replace(T, "'", "&apos;")
T = Replace(T, "à", "&#224;")
T = Replace(T, "é", "&#233;")
T = Replace(T, "è", "&#232;")
T = Replace(T, "ì", "&#236;")
T = Replace(T, "ò", "&#242;")
T = Replace(T, "ù", "&#249;")
Testo_XML = T
End Function

Io nel mio progetto VB6 uso il riferimento:
Microsoft XML, v6.0
e quindi:
Public xDOC As MSXML2.DOMDocument
Set xDOC = New MSXML2.DOMDocument
xDOC.validateOnParse = False
'
If xDOC.Load(XMLnomeFile) Then
'Va bene
Else
' The document failed to load.
Dim strErrText As String
Dim xPE As MSXML2.IXMLDOMParseError
' Obtain the ParseError object
Set xPE = xDOC.parseError
With xPE
strErrText = "Your XML Document failed to load" & _
"due the following error." & vbCrLf & _
"Error #: " & .errorCode & ": " & xPE.reason & _
"Line #: " & .Line & vbCrLf & _
"Line Position: " & .linepos & vbCrLf & _
"Position In File: " & .filepos & vbCrLf & _
"Source Text: " & .srcText & vbCrLf & _
"Document URL: " & .url
End With
MsgBox strErrText, vbExclamation
End If

Il problema nasce appunto quanto è presente
il carattere ° (gradi).
In questo caso il LOAD genera errore e fa riferimento
alla riga in cui è presente il carattere °

Ciao Andrea e grazie.
Sauro


Sauro

unread,
May 18, 2016, 8:53:59 AM5/18/16
to
[cut]

Solo per dirla tutta aggiungo che io creo il
file XML con VB6 senza usare il riferimento
di cui nel post precedente.

Lo uso solo per rileggere il file in modo da
verificare l'assenza di errori.

Riciao Andrea
Sauro


SB

unread,
May 18, 2016, 9:38:52 AM5/18/16
to
Il giorno Wed, 18 May 2016 14:46:36 +0200, "Sauro" <vic...@crsscala.it> ha
scritto:

>
>"Andrea (Work)" ha scritto nel messaggio.
>
>>>
>Public Function Testo_XML(ByVal T As String) As String
>T = Replace(T, "&", "&amp;")
>T = Replace(T, "<", "&lt;")
>T = Replace(T, ">", "&gt;")
>T = Replace(T, Chr$(34), "&quot;")
>T = Replace(T, "'", "&apos;")
>T = Replace(T, "à", "&#224;")
>T = Replace(T, "é", "&#233;")
>T = Replace(T, "è", "&#232;")
>T = Replace(T, "ì", "&#236;")
>T = Replace(T, "ò", "&#242;")
>T = Replace(T, "ù", "&#249;")
>Testo_XML = T
>End Function

In pratica vai a sostiture al carattere il valore ASCII

Potresti generalizzare la funzione:

Function Testo_XML (ByVal Ch As String) As String

Testo_XML = Replace(Testo_XML, Ch, Chr(38) & "#" & Cstr (Asc(Ch)) &";" )

End Function

Testo1 = Testo_XML(Testo1, "ù")


Non l'ho provata, è solo per darti uno spunto


--
ciao
Stefano

Sauro

unread,
May 18, 2016, 5:06:58 PM5/18/16
to

"SB" ha scritto nel messaggio
>>
>>Public Function Testo_XML(ByVal T As String) As String
>>T = Replace(T, "&", "&amp;")
>>T = Replace(T, "<", "&lt;")
>>T = Replace(T, ">", "&gt;")
>>T = Replace(T, Chr$(34), "&quot;")
>>T = Replace(T, "'", "&apos;")
>>T = Replace(T, "à", "&#224;")
>>T = Replace(T, "é", "&#233;")
>>T = Replace(T, "è", "&#232;")
>>T = Replace(T, "ì", "&#236;")
>>T = Replace(T, "ò", "&#242;")
>>T = Replace(T, "ù", "&#249;")
>>Testo_XML = T
>>End Function
>
> In pratica vai a sostiture al carattere il valore ASCII
>
> Potresti generalizzare la funzione:
>
> Function Testo_XML (ByVal Ch As String) As String
>
> Testo_XML = Replace(Testo_XML, Ch, Chr(38) & "#" & Cstr (Asc(Ch)) &";" )
>
> End Function
>
> Testo1 = Testo_XML(Testo1, "ù")
>
>
> Non l'ho provata, è solo per darti uno spunto

Scusa Stefano ma forse non hai centrato il problema
al di là del fatto che la mia funzione possa essere
scritta meglio.

1) XML rifiuta un certo numero di caratteri che, se presenti,
vanno "mascherati" nel modo che abbiamo visto

2) Il carattere ° (gradi) non fa parte di questa serie di caratteri

3) Usando nel progetto vb6 il riferimento:
Microsoft XML, v6.0
e quindi:
Public xDOC As MSXML2.DOMDocument
Set xDOC = New MSXML2.DOMDocument
If xDOC.Load(XMLnomeFile) Then
'Va bene
Else
'Da errore se è presente il carattere ° nel file
End If

4) come si spiega?


Ciao Stefano
Sauro


SB

unread,
May 19, 2016, 3:13:35 AM5/19/16
to
Il giorno Wed, 18 May 2016 23:06:58 +0200, "Sauro" <vic...@crsscala.it> ha
scritto:

>
Non lo so, ma secondo la logica che hai usato prima, il carattere
° in ASCII è 0xB0 o 176 decimale.

Se sostituendo ° con &#176; non ti funziona allora il parser Xml non vede
quel carattere, di solito per i caratteri speciali si usano codifiche tipo UTF8.

https://it.wikipedia.org/wiki/UTF-8

Per usare UTF8 in Xml basta inserire all'inizio:
<?xml version="1.0" encoding="UTF-8"?>

http://www.w3schools.com/xml/xml_syntax.asp

Se vuoi modificare il tuo testo e salvarlo in UTF8 per provare lo puoi aprire e
poi salvare con Notepad usando la codifica UTF8 invece che ASCII.

Se devi usare VB, la conversione si fa abbastanza semplicemente usando qualche
API, io l'ho fatto tempo fa, e se ti interessa posso rispolverare quel
programma.


--
ciao
Stefano

Sauro

unread,
May 19, 2016, 3:23:48 AM5/19/16
to

"SB" ha scritto nel messaggio

[CUT]

> Non lo so, ma secondo la logica che hai usato prima, il carattere
> ° in ASCII è 0xB0 o 176 decimale.
>
> Se sostituendo ° con &#176; non ti funziona allora il parser Xml non
> vede
> quel carattere, di solito per i caratteri speciali si usano codifiche tipo
> UTF8.
>
> https://it.wikipedia.org/wiki/UTF-8
>
> Per usare UTF8 in Xml basta inserire all'inizio:
> <?xml version="1.0" encoding="UTF-8"?>
>
> http://www.w3schools.com/xml/xml_syntax.asp
>
> Se vuoi modificare il tuo testo e salvarlo in UTF8 per provare lo puoi
> aprire e
> poi salvare con Notepad usando la codifica UTF8 invece che ASCII.
>
> Se devi usare VB, la conversione si fa abbastanza semplicemente usando
> qualche
> API, io l'ho fatto tempo fa, e se ti interessa posso rispolverare quel
> programma.


Grazie Stefano

Facio qualche prova e poi ti dirò.

Ciao, Sauro


Sauro

unread,
May 20, 2016, 5:12:36 AM5/20/16
to
[CUT]

Sono andato a leggermi l'UTF8 e così ho capito il motivo
dell'errore generato dal carattere ° il quale supera i primi
128 caratteri ed io ho utilizzato il semplice file ASCII.

Poi ho riflettuto e fatto qualche prova per concludere che
i caratteri da tastiera che superano i primi 128 caratteri
sono veramente pochi (°£?ç§) oltre alle vocali minuscole
accentate.

Per cui ho deciso, almeno per il momento, di non imbarcarmi
nell'uso dell'UTF8 ma solamente di aggiungere qualche riga
nella mia funzione (&#numero;) per trattare quei cinque
caratteri.

Questo approfondimento sull'UTF8 mi è comunque servito
per capire e per risolvere il problema.

Grazie per l'aiuto.
Ciao Stefano
Sauro



0 new messages