Parcourir une ligne lettre par lettre

Klaas

XLDnaute Nouveau
Bonjour,

Mon problème est le suivant:

J'ai un code XML composé de 5 linges:
<maison>
<1eratage>
<salon><tapis><Dateachat>02022009</Dateachat><tapis><lieuachat>canapi</lieuachat></salon>
</1eretage>
</maison>

Pour le parcourir je le transforme en fichier texte et je le parcours ligne par ligne

Cependant je veux enlever des informations de ce XML, ici la partie en gras, pour pouvoir l'importer sous excel sans cette info.

Mon alfo consiste à parcourir lettre par lettre à partir de la ligne ou le début est <Salon>, mais ca ne marche pas:

Mon code est composé de plein de balise de ce type et je souhaite a chaque fois enlevé cette info, mais il ne marche pas, il ne traite pas la ligne en entier

Sub modifXMLLigneEtape2()


Dim CalculationTime As Single
CalculationTime = Timer

Dim TempLettre As String
Dim TempLigne As String
Dim TempFinMot As String
Dim TempLigneDelete As String
TempLigneDelete = "<Dateachat>"
Dim TempLigneDeleteFermeture As String
TempLigneDeleteFermeture = "</DateAchat>"
Dim TempSelectionDelete As String
Dim TempLigneSelectionAGarger As String


Open "h:\My Documents\Projet 3\essai.xml" For Input As #1
Open "h:\My Documents\Projet 3\Res_essai.xml" For Output Access Write As #2


Do While Not EOF(1)



Line Input #1, TempLigne



If Mid(TempLigne, 13, Len(TempLigneDelete)) = TempLigneDelete Then

TempSelectionDelete = Mid(TempLigne, 13, Len(TempLigneDelete))

Do While Right(TempSelectionDelete, Len(TempLigneDeleteFermeture)) <> TempLigneDeleteFermeture
Do While TempLigne = TempLigne
TempLettre = Input(1, TempLigne)
TempSelectionDelete = TempSelectionDelete & TempLettre
Loop
Loop
TempSelectionDelete = ""

Else
Print #2, TempLigne
Debug.Print TempLigne
End If

Loop

Close #1
Close #2

Debug.Print Timer - CalculationTime

End Sub

Comment faire ? Avez vous d'autres solutions totalement différentes ? Si oui, je le prends volontiers.

merci
 

tototiti2008

XLDnaute Barbatruc
Re : Parcourir une ligne lettre par lettre

Bonjour Klaas,

Juste un essai qui pourrait te mettre sur la voie

Code:
z = "<salon><tapis><Dateachat>02022009</Dateachat><tapis><lieuachat>canapi</lieuachat></salon>"
If z Like "*<Dateachat>########</Dateachat>*" Then
    z = Left(z, 14) & Right(z, Len(z) - 45)
End If
MsgBox z
 

Klaas

XLDnaute Nouveau
Re : Parcourir une ligne lettre par lettre

Est ce possible de mettre un nombre Pas défini de #, c a d que l'interieur de mes balise ne fait pas tout le temps la meme taille, et il y a 10000 fois ce que j'ai mis mais avec des différences à l'intérieur.
Je peux me permettre de compter le début mais pas la fin.
Merci en tout cas
 

sousou

XLDnaute Barbatruc
Re : Parcourir une ligne lettre par lettre

bonjour
Tu peux essayer ce principe
ici la phrase est en a1
il'instruction instr detecte la balise de départ et celle de fin

Sub debut()
phrase = Range("a1")
deb = InStr(1, phrase, "<Dateachat")
fin = InStr(1, phrase, "/Dateachat>") + 11
maphrase = Left(phrase, deb) & Right(phrase, Len(phrase) - fin)
End Sub
 
G

Guest

Guest
Re : Parcourir une ligne lettre par lettre

Bonjour,

Une proposition en utilisant la référence à Microsoft xml Vx

Code:
Sub SupprimerDateAchat()
    Dim xmlDoc As New MSXML2.DOMDocument30
    Dim currNode As IXMLDOMElement
    [COLOR=red]xmlDoc.loadXML ("<maison><etage niveau='1'><salon><tapis><Dateachat>02022009</Dateachat><lieuachat>canapi</lieuachat></tapis></salon></etage></maison>")
[/COLOR]    Set currNode = xmlDoc.documentElement.getElementsByTagName("Dateachat").Item(0)
    currNode.parentNode.removeChild currNode
End Sub

en remplaçant la ligne en rouge par xmlDoc.Load(NomCompletFichierXML)
le fichier doit contenir un xml bien formé. Ce que tu nous a donné comporte des erreurs.

A+
 

Klaas

XLDnaute Nouveau
Re : Parcourir une ligne lettre par lettre

Pour sousou, je ne peux pas mettre mon fichier dans excel, mon but est de l'importer dans EXCEL une fois qu'il est traité,

il fait 22000 ko et je vous ai mis un extrait de la balise qui se repete.
M
Sinon pour Hasco, cette ligne ne marche pas:

Set currNode = xmlDoc.documentElement.getElementsByTagName("Dateachat").Item(0)
currNode.parentNode.removeChild currNode
End Sub

Je ne sais pas pourquoi.

Ne peut on pas traiter le fichier XML en tant que fichier TXT et parcourir la ligne lettre par lettre ?
 
G

Guest

Guest
Re : Parcourir une ligne lettre par lettre

Re tous,

Set currNode = xmlDoc.documentElement.getElementsByTagName("Datea chat").Item(0)
currNode.parentNode.removeChild currNode

Laquelle des deux ne marche pas?
Certainement ton xml est mal formé.
Pas nom de balise commençant par des chiffres (1eretage:()
Dans ce que tu nous avais donné il y avait d'autres erreurs:
balise de fermeture de Tapis mal imbriquée etc.

A partir du moment où ton xml est bien formé, il n'y a pas de raison que cela ne marche pas. A moins que tes données soient plus complexes qu'il n'y parait.

A+
 

Klaas

XLDnaute Nouveau
Re : Parcourir une ligne lettre par lettre

C'est la première ligne qui ne marche pas.

et ce que si j'arrive à ouvrir mon fichier .xml avec IE6 sans probleme, alors il est bien redigé ? Car c'est le cas et pourtant la premiere ligne bug.

Je vous donne une autre ligne de mon code:

<List>
<secu>
<Model><Provi><option><strike><Date><expDate>20090101</expDate></Date><Price>100.0</Price></strike></option></Provi></Model>
</secu>
</List>

Mon but est d'enlever la partie en gras,

Voila mon code, sachant que je souhaite un code qui marche pour cette ligne de facon générale, elle marcherait pour tout type de ligne avec n'importe quelle nombre de caractere a l'interieur de la balise expdate

Mon but est d'enlever tout ce quil y a dans les balises expdate et les balises expdate

Pour sousou, je veux bien les autres solutions stp

merci à vous
 

tototiti2008

XLDnaute Barbatruc
Re : Parcourir une ligne lettre par lettre

Bonjour Hasco, Bonjour PierreJean, Bonjour sousou,

Sinon, si le XML n'est pas aux normes, il reste la solution de sousou
(en la mixant à la mienne qui était incomplète)

Code:
Line Input #1, phrase
if phrase like "*<Dateachat>*</Dateachat>*" then
deb = InStr(1, phrase, "<Dateachat")
fin = InStr(1, phrase, "/Dateachat>") + 11
phrase= Left(phrase, deb) & Right(phrase, Len(phrase) - fin)
end if

évidement, si les balises d'ouverture et de fermeture de Dateachat sont toujours sur la même ligne
 

Klaas

XLDnaute Nouveau
Re : Parcourir une ligne lettre par lettre

Oui merci tototiti mais mon probleme est que ma longueur n'est pas fixe, j'ai réussi à faire le meme algo que toi.

Auriez vous un algo qui ne fixe pas la longueur entre le début et la fin svp

mais sinon je souhaiterai un algo de ce type la
 

Discussions similaires

Statistiques des forums

Discussions
312 839
Messages
2 092 688
Membres
105 509
dernier inscrit
hamidvba