I was not perfectly happy with the current implementation of the PB Commands WRAP$ and UnWrap$
therefore here is my version:
%XML_BEGIN_TAG = 60 ' <
$XML_BEGIN_TAG =CHR$(60)
%XML_END_TAG = 62 ' >
$XML_END_TAG =CHR$(62)
' White-Space characters: #x20 | #x9 | #xD | #xA
$XML_WSP=CHR$(&H20,&H9,&HD,&HA)
'##############################################################################
'##############################################################################
'
MACRO G_REG()
REGISTER R01 AS LONG,R02 AS LONG
END MACRO
'##############################################################################
'##############################################################################
'
MACRO G_S01()
LOCAL S01 AS STRING
END MACRO
'##############################################################################
'##############################################################################
'
MACRO G_T01()
LOCAL T01 AS LONG
END MACRO
MACRO G_T02()
LOCAL T01,T02 AS LONG
END MACRO
'##############################################################################
'##############################################################################
'
' 0/1 ob das Zeichen (ASC-Wert) ein XML-Whitespace ist oder nicht
FUNCTION XML_Is_SP_ASC(BYVAL U01 AS LONG) AS LONG
G_REG
G_S01
S01=CHR$(U01)
IF INSTR($XML_WSP,S01) THEN R01=1 ELSE R01=0
enx:
FUNCTION=R01
END FUNCTION
'##############################################################################
'##############################################################################
'
FUNCTION xml_Wrap(BYREF U01 AS STRING) AS STRING
G_REG
G_S01
S01=xml_UnWrap(U01)
S01=WRAP$(S01,"<",">")
enx:
FUNCTION=S01
END FUNCTION
'##############################################################################
'##############################################################################
'
FUNCTION xml_UnWrap(BYREF U01 AS STRING) AS STRING
G_REG
G_T02
G_S01
T01=LEN(U01)
IF zero(T01) THEN S01="":GOTO enx
T02=INSTR(U01,"<")
IF zero(T02) THEN GOTO Lab_A01
IF T02=1 THEN GOTO Lab_A02
' Eine "<" ist da aber nicht an Pos.1
FOR R01=1 TO T02
R02=ASC(U01,R01)
IF XML_Is_SP_ASC(R02) THEN
ITERATE FOR
ELSEIF R02=%XML_BEGIN_TAG THEN
U01=MID$(U01,R01+1)
GOTO Lab_A02
ELSE
EXIT FOR
END IF
NEXT
U01=MID$(S01,R01+1)
'-------------------
Lab_A02:
U01=LTRIM$(U01,"<")
'-------------------
Lab_A01:
T01=LEN(U01)
IF zero(T01) THEN S01="":GOTO enx
R02=INSTR(-1,U01,">")
IF R02=0 THEN GOTO enz
IF R02=T01 THEN GOTO Lab_over
T02=R02
'-------------------
R02=ASC(U01,-1)
IF zero(XML_Is_SP_ASC(R02)) THEN GOTO Lab_over
FOR R01=T01 TO T02 STEP -1
R02=ASC(U01,R01)
IF XML_Is_SP_ASC(R02) THEN
ITERATE FOR
ELSEIF R02=%XML_END_TAG THEN
U01=MID$(U01,1,R01-1)
GOTO Lab_over
ELSE
EXIT FOR
END IF
NEXT
U01=MID$(U01,1,R01-1)
Lab_over:
S01=RTRIM$(U01,">")
enx:
FUNCTION=S01
EXIT FUNCTION
enz:
S01=U01
GOTO enx
END FUNCTION
'##############################################################################
'##############################################################################
These handle multiple brackets like " <<<tag >> better.
Also tags with Spaces around will be trimmed first.
Spaces inside the tag are preserved.
Hi Theo,
I can't compile it via PB/Win 10.04, because compiler does not know what "zero" is (first used around line 64).
Could you give me a hint?
Thanks,
Petr
Sorry, Peter.
MACRO zero(P1) = (P1=0&)
:-)
Example: If zero(X) then