Page 1 of 1
FormatXML and #PB_ReFormat
Posted: Sun Aug 31, 2008 5:10 pm
by Lukaso
Hi,
has someone allready thinked about #PB_ReFormat using FormatXML and the way the output looks like?
Example:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<gwcore>
<module name="gwpp" load="true">
<test.test>
some text
</test.test>
<test.long>
299
</test.long>
</module>
</gwcore>
The problem is GetXMLNodeText will return all spaces and new lines, it is a bit stupid for loading a formated saved xml with pb again and work with.
A formated xml output (like ie or firefox displays) like this whould be better in my opinion.
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<gwcore>
<module name="gwpp" load="true">
<test.test>some text</test.test>
<test.long>299</test.long>
</module>
</gwcore>
what are you guys think about?
Posted: Sat Feb 14, 2009 7:24 pm
by Thorsten1867
A small workaround:
Code: Select all
Procedure SaveBeautifyXML(XMLId.l, XMLFile$)
Protected i, Lpos, Rpos = 1, pos = 1, indent = 0, tag$ = "", ntag, xml$, new$, encoding$
If IsXML(XMLId)
xml$ = Space(ExportXMLSize(XMLId))
ExportXML(XMLId, @xml$, Len(xml$))
xml$ = RemoveString(xml$, Chr(13))
For i=1 To CountString(xml$, "<")
Lpos = FindString(xml$, "<", Rpos)
Rpos = FindString(xml$, ">", Lpos)
ntag$ = Mid(xml$,Lpos, Rpos-Lpos+1)
If tag$="" ; <?xml version="1.0" encoding="UTF-8"?>
new$ = ntag$
If FindString(ntag$, "UTF-8",1)
encoding$ = "UTF-8"
EndIf
indent - 2
ElseIf Left(tag$,2) <> "</" And Left(ntag$,2) = "</" ; <Tag></Tag>
txt$ = Trim(Mid(xml$, pos, Lpos-pos))
If Left(txt$,1) = #LF$
txt$ = Trim(Mid(txt$,2))
EndIf
If Right(txt$,1) = #LF$
txt$ = Trim(Left(txt$,Len(txt$)-1))
EndIf
new$ + txt$ + ntag$
Else
If Left(tag$,2) = "</" And Left(ntag$,2) = "</" ; ; </Tag2></Tag1>
indent - 2
ElseIf Left(tag$,2) <> "</" And Left(ntag$,2) <> "</" ; ; <Tag1><Tag2>
indent + 2
EndIf
new$ + #LF$ + Space(indent) + ntag$
EndIf
tag$ = ntag$
pos = Rpos+1
Next
If CreateFile(0, XMLFile$)
If encoding$ = "UTF-8"
WriteStringFormat(0, #PB_UTF8)
WriteString(0, new$, #PB_UTF8)
Else
WriteString(0, new$)
EndIf
CloseFile(0)
EndIf
EndIf
EndProcedure
If LoadXML(1, "address.xml")
SaveBeautifyXML(1, "adress.xml")
FreeXML(1)
EndIf
Before:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<Adressen Anzahl="1">
<Adresse id="1">
<Name>
Thorsten Hoeppner
</Name>
<Strasse>
Alte Zeile 18
</Strasse>
<Ort>
87600 Kaufbeuren
</Ort>
</Adresse>
</Adressen>
After:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<Adressen Anzahl="1">
<Adresse id="1">
<Name>Thorsten Hoeppner</Name>
<Strasse>Alte Zeile 18</Strasse>
<Ort>87600 Kaufbeuren</Ort>
</Adresse>
</Adressen>
Posted: Sun Feb 15, 2009 12:03 am
by Little John
I'm supporting this feature request.
However, another workaround is, instead of using
use something like this
Code: Select all
#WHITESPACE$ = " " + #TAB$ + #CRLF$
Procedure.s TrimChars (source$, charList$=#WHITESPACE$)
; in : string
; out: string without any leading or trailing characters,
; that are contained in 'charList$'
Protected left, right, length=Len(source$)
; Trim left
left = 1
While (left <= length) And FindString(charList$, Mid(source$,left,1), 1)
left + 1
Wend
; Trim right
right = length
While (left < right) And FindString(charList$, Mid(source$,right,1), 1)
right - 1
Wend
ProcedureReturn Mid(source$, left, right-left+1)
EndProcedure
text$ = TrimChars(GetXMLNodeText(*node))
Regards, Little John
Posted: Wed Jun 24, 2009 5:02 pm
by Perkin
I've just needed to use this formatting, however have had one problem.
When a tag is followed directly by its close tag (i.e. is empty), the output is changed to <Tag/> when I would like the old <Tag></Tag>
becomes
I've looked at the code, but cannot see how it's eliminating the end tag.
Can anyone help?[/code]
Posted: Wed Jun 24, 2009 5:49 pm
by Little John
Please try
this code.
Regards, Little John
Posted: Wed Jun 24, 2009 7:40 pm
by Perkin
That code didn't work either.
Here's a shortened orig input file (It's appears as one long line in a xml file)
Code: Select all
<?xml version="1.0" encoding="ISO-8859-1"?><Template><Version>1.0</Version><Page><Name>A4</Name><Properties><String id="Author"></String><String id="Width">297.000000MM</String><String id="Height">210.000000MM</String></Properties><Content></Content></Page></Template>
Now here's the output from that code
Code: Select all
<?xml version="1.0" encoding="ISO-8859-1"?>
<Template>
<Version>1.0</Version>
<Page>
<Name>A4</Name>
<Properties>
<String id="Author"/>
<String id="Width">297.000000MM</String>
<String id="Height">210.000000MM</String>
</Properties>
<Content/>
</Page>
</Template>
Notice the <string id="Author"/> and the <Content/> tags.
Here's what I need as the result.
Code: Select all
<?xml version="1.0" encoding="ISO-8859-1"?>
<Template>
<Version>1.0</Version>
<Page>
<Name>A4</Name>
<Properties>
<String id="Author"></String>
<String id="Width">297.000000MM</String>
<String id="Height">210.000000MM</String>
</Properties>
<Content></Content>
</Page>
</Template>
Any help will be appreciated.
Posted: Wed Jun 24, 2009 9:52 pm
by Little John
It's some time ago when I dealt with this stuff ...
Well, I see the problem now: The combination of PB's
LoadXML() and
ExportXML() does the unwanted conversion. Fortunately, for your problem at hand we do not need it anyway.
So please see my new procedure
FormatXMLfile() here.
Regards, Little John
Posted: Thu Jun 25, 2009 12:22 am
by Perkin
That does it.

Thanks Little John