Aller au contenu

Xml read/write


tyrese69_

Messages recommandés

Bonsoir à tous,

 

Voici un fichier XML :

 

<?xml version="1.0"?>

<TPS_CMD_TABLE>

<TPSCmds><NAME>XCL</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>1</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>VC</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>VT</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>PTM</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>SCUG</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>SCUO</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>SCUI</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>INS</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>INSDS</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>INSDT</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>ASCU</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>TPSU</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>DIVPT</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

<TPSCmds><NAME>VPCTAB</NAME><FILENAME>TPS_Cmd.lsp</FILENAME><CMD_NUMBER>0</CMD_NUMBER></TPSCmds>

</TPS_CMD_TABLE>

 

Qui doit mémoriser, les actions faites par une commande AutoCAD !

 

Ma question est comment incrémenter la valeur de <CMD_NUMBER>0</CMD_NUMBER> de 0 à 1 etc

 

Pour une valeur spécifique de la valeur <NAME>ASCU</NAME>

 

Je n'ai pas de problème de lecture, mais pour écrire .????

 

merci d'avance !

Daniel OLIVES

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'avais essayé il y quelques temps de lire et écrire du XML en LISP, mais j'ai assez vite renoncé : c'est tellement plus facile avec .NET (il me semble que tu t'y es mis aussi).

 

Un exemple pour ce que tu veux faire (si j'ai bien compris, mais c'est pas sûr) avec Linq to Xml :

        private static void Foo(string filename)
       {
           int i = 0;
           XDocument doc = XDocument.Load(filename);
           foreach (XElement ele in doc
               .Element("TPS_CMD_TABLE")
               .Elements("TPSCmds")
               .Select(e => e.Element("CMD_NUMBER")))
           {
               ele.Value = string.Format("{0}", i++);
           }
           doc.Save(filename);
       }

Et il y en a encore qui pense qu'on écrit plus de code en NET qu'en LISP...

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

Encore merci à toi Gile, il faudra que je regarde le dot net un de ces jours !

 

Voici le résultat en VLISP: avec les routines de :

;;;************************************************************************
;;; 100 - api-xml.lsp
;;; Prepared by: J. Szewczak
;;; Date: 4 January 2004
;;; Purpose: To provide an API for interfacing with XML files.
;;; Copyright (c) 2004 - AMSEC LLC - All rights reserved

du forum TheSwamp :
http://www.theswamp.org/index.php?topic=525.30

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	"C:\\TPS\\Acad\\Routinesx64\\TPS-Cmd.xml"
;<Settings>
;	<Layers>
;		<Layer Name="Walls" Color="2" LineType="continuous"/>
;		<Layer Name="Furniture" Color="3" LineType="HIDDEN"/>
;	</Layers>
;	<DrawingVars>
;		<RegenAuto>1</RegenAuto>
;		<EdgeMode>0</EdgeMode>
;		<Osmode>383</Osmode>
;	</DrawingVars> 
;	<TPSCmds>
;		<TPSCmd Name="VC" Fichier="TPS_Cmd.lsp" Nombre="1"/>
;		<TPSCmd Name="PTM" Fichier="TPS_Cmd.lsp" Nombre="1"/>
;		<TPSCmd Name="INS" Fichier="TPS_Cmd.lsp" Nombre="1"/>
;		<TPSCmd Name="INSDS" Fichier="TPS_Cmd.lsp" Nombre="1"/>
;		<TPSCmd Name="INSDT" Fichier="TPS_Cmd.lsp" Nombre="1"/>
;	</TPSCmds> 
;</Settings>
;	(defun ReadXml ( oXML 
(defun LecCmdXml ( FileCmd NameCmd /)
;; Load the VisualLISP stuff
(vl-load-com)

;; Store an Active-X object to the main node ("Settings") of the XML data file.
(setq oSettings (XML-Get-XMLObject "C:\\TPS\\Acad\\Routinesx64\\TPS_Cmd1.xml"))

;; Store an Active-X object to the "DrawingVars" node of the XML file.
;;(setq oDwgVars (XML-Get-Child oSettings nil "DrawingVars"))
;
;	(setq oTPSCmds (XML-Get-Child oSettings nil "TPSCmds"))

;; The following two lines return the exact same thing.
;; An string object representing the value stored in the RegenAuto child node of the DrawingVars node.
;;	(setq sRegenValue (XML-Get-Child-Value oDwgVars nil "RegenAuto"))
; or
;;	(setq sRegenValue (XML-Get-Child-Value oSettings "DrawingVars" "RegenAuto"))

;; Return the value that is stored inside a "Color" attribute from the child node of Layers whose "Name" attribute = "Walls"
;;(setq color (read (XML-Get-Attribute (XML-Get-Child-ByAttribute oSettings "Layers" "Name" "Walls") "Color" "-1")))

(setq Lnbre (read (XML-Get-Attribute (XML-Get-Child-ByAttribute oSettings "TPSCmds" "Name" NameCmd) "Nombre" "-1")))

;; if the value for 'color' that we got above is less than the zero (our supplied default argument was -1).
;; then we'll set that attribute to 2.
;(if (< Lnbre 0)
  (progn
	;;	 (XML-Put-Attribute (XML-Get-Child-ByAttribute oSettings "Layers" "Name" "Walls") "Color" 2)
	(XML-Put-Attribute (XML-Get-Child-ByAttribute oSettings "TPSCmds" "Name" NameCmd) "Nombre" (itoa (+ Lnbre 1)))

	;; After changing the Active-X object that is resident in memory,
	;; we have to save all of our changes back to the XML file.
	(XML-Save oSettings)
  )
;)

;; release the objects
(vlax-release-object oSettings)
;	(vlax-release-object oDwgVars)
)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut,

ci joint le code que j'utilise pour la lecture de fichier xml.

En fait, il s'agit spécialement de lire dans des fichiers excel xml.

Il y a deux type d'usage :

des onglets qui contiennent des données au format INI

[section]

val1

val2

...

val n

 

donnera !section : '(val1 val2 ... valn)

ça c'est avec pw_charger_xml

 

Sinon, c:chargeTableXml fonctionne différemment :

le nom des variables lisp est pris dans le nom des onglets:

chaque onglet doit donc contenir une seule liste de valeur:

c'est pourquoi je parle de chargertablexml.

 

 

 

;;-------------------------------------------------------------------------------------------------
;§**/xml/ crée la liste d'association à partir de la lecture brute des celulles xml/lxml
;; l'onglet ne doit contenir qu'une table et une seule, avec une ligne d'entête donnant le nom des colonnes
;;
(defun pw_creeListeAssocFromXml
		 (lxml / ltempo nmls tmp)
 (setq 1erligne (car lxml)
lxml (cdr lxml))
 

 
 (foreach lrow	lxml
   ;;(Pw_RegExp  "[mot];;;;;;;" "\\[+.*\\]+")->((("MATCH" "[mot]") ("@" 0) ("LENGTH" 5) nil))
   (cond
     ;;ligne vierge
     ((apply '= (cons nil lrow))
      ;;passe la ligne
      nil
     )
;;;      ;;commentaire
;;;      ((= (substr (pw_nil_T (car lrow)) 1 1) ";")
;;;       ;;passe la ligne
;;;       nil
;;;      )
;;;      ;;nom de variable
;;;      ((setq tmp (Pw_RegExp (pw_nil_T (car lrow)) "\\[+.*\\]+"))
;;;
;;;       ;; (= (substr tempo 1 1) "[")
;;;       ;;on est à l'entête : [maliste]
;;;       (if ltempo
;;;	 (progn
;;;	   (set (read nmls) ltempo)
;;;	   (setq ltempo nil)
;;;	 )
;;;       )
;;;       (setq nmls (cadr (assoc "MATCH" (car tmp))))
;;;       (setq nmls (pw_enlev_gd nmls))
;;;      )
     
     ;;liste de valeurs
     (T
      (setq ltempo (cons (pw_merge_LIST 1erligne lrow) ltempo ))
     ) ;_#
   ) ;_#cond
 )
 (reverse ltempo)

)

;;**************************************************************************
;;§/xml/retourne le noeud par sélection par nom/xmlDoc tagname
;;xmlDoc = IXMLDOMDocument2 
;;retourne  soit nil, soit un IXMLDOMNode

(defun pw_xmldoc_getNodeByName ( xmlDoc tagname )
(setq wkb (vlax-invoke-method xmlDoc 'getElementsByTagName tagname))
(setq deb (vlax-get-property wkb 'context))
;;(setq debchlnd (vlax-get-property deb 'childNodes))
)

;;**************************************************************************
;;§/xml/retourne le noeud par sélection par nom/xmlNod tagname
;;xmlnod = IXMLDOMNode
;;retourne  soit nil, soit un IXMLDOMNode

(defun pw_xmlnode_getNodeByName (xmlnod tagname / finit noeud chlnd res i nb)
 (if (vlax-invoke-method xmlnod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property xmlnod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (and (not finit) (< i nb))
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (=  (vlax-get-property noeud 'Basename) tagname) ;_Tagname sans le ss: ex : ss:Worksheet->Worksheet
  (setq finit T
	res noeud)
)
     )
   )
 )
 res
)


;;**************************************************************************
;;§/xml/retourne le nombre de colonne d'un fichier xls xml / tablenod
;;xmlnod = IXMLDOMNode
;;
;;en pratique: ne sert à rien, car le nombre de colonne ne correspond pas au nombre de cell dans chaque row

(defun pw_xmlsColumnNumber (tablenod / finit noeud chlnd nbcol)
 (setq nbcol 0)
 (if (vlax-invoke-method tablenod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property tablenod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (< i nb)
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (= (vlax-get-property noeud 'Basename) "Column") ;_Tagname sans le ss: ex : ss:Worksheet->Worksheet
  (setq nbcol (+ 1  nbcol))
)
     )
   )
 )
 nbcol
)
;;**************************************************************************
;;§/xml/lit une  cellule / cellnod
;;retourne '("val" idx)
;;val peut etre une chaine, ou nil ou un nombre
;;idx peut etre
;; - soit nil (cellules qui se suivent)
;; - soit un integer (cellules contennant des datas qui viennent après un série de celulles vides)
;; - soit un integre de valeur 256 (cellule vides qui est ajouté à chaque ligne, ne contient jamais de data)

(defun pw_xmlsReadOneCell ( cellnod  / att sty typ txt  )
 (setq attcell (vlax-get-property cellnod 'Attributes))
 (if (setq idx (vlax-invoke-method attcell 'getNamedItem "ss:Index"))
     (setq tmp2 idx
    idx (vlax-get-property idx 'value)
    idx (vlax-variant-value idx))
    )
 
 (if (setq data (pw_xmlnode_getNodeByName cellnod "Data"))
  (progn
    (setq att (vlax-get-property data 'Attributes))
    (setq sty (vlax-invoke-method att 'getNamedItem "ss:Type"))
    
    (setq typ (vlax-get-property sty 'value))
    (setq typ (vlax-variant-value typ))
    ;(print typ)
    (setq txt (vlax-get-property data 'text))
    ;(print txt)
    (list (pw_xmlVal2Type txt typ) idx)
    
  )
 )
)
;;**************************************************************************
;;§/xml/lit un attribut / xmlnod attName
;;ss:Name

(defun pw_xmlsReadOneAtt ( xmlnod attName  / atts att val  )
 (if (setq atts (vlax-get-property xmlnod 'Attributes))
  (progn
    (setq att (vlax-invoke-method atts 'getNamedItem attName))
    (setq val (vlax-get-property att 'value))
    (vlax-variant-value val)
  )
 )
)

;;**************************************************************************
;;§/xml/transforme la valeur texte xml en son type spécifié / val typ 

(defun pw_xmlVal2Type (  val typ   / )
 (cond
   ((= typ "String")
    val
   )
   ((= typ "Number")
    (read val)
   )
 )
)

;;**************************************************************************
;;§/xml/lit toutes  les cellules, comme pw_charger_ini/tblnod 

(defun pw_xmlsReadAllCells (tblnod / lres i)
 (setq i 0)
 (setq lrow (pw_xmlsListAllRow tblnod))
 (foreach row lrow
   ;;(print i)
   (if	(setq lcell (pw_xmlsListAllCell row))
     (progn
(setq lcell (mapcar 'pw_xmlsReadOneCell lcell))
;;(setq lcell (pw_supp_all 'nil lcell))
(setq lcell (pw_xmlTrtLvalCell lcell))
(setq lcell (mapcar 'pw_nil_t lcell))
(if (not (and (PW_EGAL_LIST lcell)
	      (member "" lcell)
	 )
    ) ;_c'est une ligne vide dans le fichier xml
  (setq lres (cons lcell lres))
)
     )
   )

   (setq i (+ 1 i))
 )
 (reverse lres)
)


;;**************************************************************************
;;§/xml/traite la liste des valeurs de celulle lues, en fonction de la valeurs index /lvalcell
;;lvacell '((idx1 lvalcell1) ... (idxn lvalcelln)

(defun pw_xmlTrtLvalCell (lvalcell / cnt lres id val)
 (setq cnt 1)
 (foreach l lvalcell
   (setq val (car l)
  id (cadr l))
   (cond ((= nil id);_cette celulle est la 1ère ou suit les autres
   (setq lres (cons val lres))
   (setq cnt (+ 1 cnt))
  )
  ((and (= 256 id)(not val));_cette celulle est la dernière et ne contient pas de données
   nil
  )
  ((numberp (setq id (pw_to_type id)));_cette celulle est une celulle contennat une valeur, après une série de celulles vides
   (setq nb (-  id cnt))
   (repeat nb (setq lres (cons "" lres)))
   (setq lres (cons val lres))
   (setq cnt (+ 1 id))
  )
  )
   
 )
 (reverse lres)
 
)

;;**************************************************************************
;;§/xml/liste de toutes les row d'une table / tablenod

(defun pw_xmlsListAllChildsByname ( Nod childname / lrow i noeud nb)

 (if (vlax-invoke-method Nod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property Nod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (< i nb)
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (= (vlax-get-property noeud 'Basename) childname)
  (setq lrow (cons noeud lrow))
)
     )
   )
 )
 (reverse lrow)
)
;;**************************************************************************
;;§/xml/liste de toutes les row d'une table / tablenod

(defun pw_xmlsListAllRow ( tablenod / lrow i nb)

 (if (vlax-invoke-method tablenod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property tablenod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (< i nb)
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (= (vlax-get-property noeud 'Basename) "Row")
  (setq lrow (cons noeud lrow))
)
     )
   )
 )
 (reverse lrow)
)

;;**************************************************************************
;;§/xml/liste de toutes les cell d'une row / rownod

(defun pw_xmlsListAllCell ( rownod / lcell noeud i nb)

 (if (vlax-invoke-method rownod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property rownod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (< i nb)
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (= (vlax-get-property noeud 'Basename) "Cell")
  (setq lcell (cons noeud lcell))
)
     )
   )
 )
 (reverse lcell)
)
;;*******************************************************************************
;;§/xml/liste de toutes les noeud child d'un noeud père par nom / fathNod NodName

(defun pw_xmlsListNodeByName ( fathNod NodName / lcell noeud chlnd nb i )

 (if (vlax-invoke-method fathNod 'HasChildNodes)
   (progn
     (setq chlnd (vlax-get-property fathNod 'childNodes))

     (setq nb (vlax-get-property chlnd 'length))
     (setq i 0)
     (while (< i nb)
(setq noeud (vlax-get-property chlnd 'item i))
(setq i (+ 1 i))
(if (= (vlax-get-property noeud 'Basename) NodName)
  (setq lcell (cons noeud lcell))
)
     )
   )
 )
 (reverse lcell)
)


;;**************************************************************************
;;§/xml/Chargement à partir d'un fichier txt des listes de parametres ds des variables globales/nomfich
(defun pw_charger_xml (fichier / lres wks xmldoc olderror )
 (setq olderror *error*)
 (setq *error* (append *error* '((vlax-release-object xmldoc)
			  (setq *error* (reverse (cddr (reverse *error*)))))))
			  
 ;;xmldoc chlnd 1er 2eme 2emechlnd nb noeud finit i lres)
 (if (setq fichier (findfile fichier))
   (progn
     (setq xmldoc (vlax-create-object "MSXML2.DOMDocument"))
     (vlax-invoke-method
xmldoc
'load
fichier
     )
     ;;(setq Wkb (pw_xmldoc_getNodeByName xmldoc "Workbook"))
     (setq Wkb (pw_xmlnode_getNodeByName xmldoc "Workbook"))

     (setq lsheet (pw_xmlsListNodeByName wkb "Worksheet"))
     
     (foreach wks lsheet
(setq tmp wks)
(print (pw_xmlsReadOneAtt  wks "ss:Name"))
(setq Tbl (pw_xmlnode_getNodeByName Wks "Table"))
;;	(setq NbCol (pw_xmlsColumnNumber tbl))
(setq lres (pw_xmlsReadAllCells tbl ))
(pw_initValFromXml lres)
     )
     (vlax-release-object xmldoc)
   )
   (prompt "\nPas de fichier xml trouvé")
 )
 (setq *error* olderror)
 (princ)
)

;;**************************************************************************
;;§/xml/Chargement à partir d'un fichier xml d'une table unique par onglet/nomfich
;;la table est affectée à une liste du nom de l'onglet
;;la 1ere ligne sert définir les code d'assoication de chaque liste
;;ex:
;;la table definie dans l'onglet "lever":
;;mat,x   ,y   ,z
;;A  ,1.0 ,1.0 ,99.0
;;B  ,2.0 ,2.0 ,98.0
;;donne la liste :!lever
;;'(("A" 1.0 1.0 99.0)
;;  ("B" 2.0, 2.0, 98.0))
;; créee la liste des variables initialisée: pw-charger-table-xml



(defun pw_charger_table_xml (fichier / lres wks xmldoc)

 (setq pw-charger-table-xml nil)
 ;;xmldoc chlnd 1er 2eme 2emechlnd nb noeud finit i lres)
 (if (setq fichier (findfile fichier))
   (progn
     (setq xmldoc (vlax-create-object "MSXML2.DOMDocument"))
     (vlax-invoke-method
xmldoc
'load
fichier
     )
     ;;(setq Wkb (pw_xmldoc_getNodeByName xmldoc "Workbook"))
     (setq Wkb (pw_xmlnode_getNodeByName xmldoc "Workbook"))

     (setq lsheet (pw_xmlsListNodeByName wkb "Worksheet"))
     
     
     
     (foreach wks lsheet
(setq tmp wks)
(print (setq NomOnglet (pw_xmlsReadOneAtt  wks "ss:Name")))
(setq pw-charger-table-xml (cons NomOnglet pw-charger-table-xml))

(setq Tbl (pw_xmlnode_getNodeByName Wks "Table"))
;;	(setq NbCol (pw_xmlsColumnNumber tbl))
(setq lres (pw_xmlsReadAllCells tbl ))
(set (read NomOnglet) (pw_creeListeAssocFromXml lres))
     )
     (vlax-release-object xmldoc)
     (prompt "\nLes tables ont été placées dans les variables :\n")
     (prompt (pw_ch_de_lst  pw-charger-table-xml " "))
   )
   (prompt "\nPas de fichier xml trouvé")
 )
)

;;**************************************************************************
;;§/xml/Chargement à partir d'un fichier xml d'une table unique par onglet/nomfich
(defun c:chargeTableXml ( / nchem fich)
(pw_bydefault "chargetableXml-chem" (getvar "dwgprefix"))
(pw_charger_table_xml (setq fich (getfiled "Fichier xml de tables de valeurs à charger : " chargetableXml-chem "xml" 0)))
(setq chargetableXml-chem (car (pw_scie_fich fich)))
(princ)
)

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité