On Saturday, November 5, 2016 at 3:42:27 PM UTC-4, Tong Sun wrote: > > > On Sat, Nov 5, 2016 at 12:26 PM, Sam Whited wrote: > >> On Fri, Nov 4, 2016 at 4:32 PM, Tong Sun wrote: >> > How to beautify a given XML string in GO?... >> >> ...If all you need is the bulit in indentation you can use >> an encoder and its indent method: >> >> https://godoc.org/encoding/xml#Encoder.Indent >> >> This is what MarshalIndent is doing under the hood. My example still >> applies, but you don't have to do it yourself. Instead you can just >> set the indentation on the encoder: >> >> https://play.golang.org/p/dVJjYvdHpS > > > I guess such thing doesn't exist, but let me ask away anyway -- the > following is exactly what I was looking for, couldn't express better than > his: > > from http://stackoverflow.com/questions/21117161: > > I like this solution, but am still in search of a Golang XML >> formatter/prettyprinter that doesn't rewrite the document (other than >> formatting whitespace). Marshalling or using the Encoder will change >> namespace declarations. For example an element like "<ns1:Element/>" will >> be translated to something like '<Element xmlns="ns1"></Element>' which >> seems harmless enough except when the intent is to not alter the xml other >> than formatting. – James McGill >> <http://stackoverflow.com/users/4979966/james-mcgill> Nov 12 '15 >> <http://stackoverflow.com/questions/21117161/go-how-would-you-pretty-print-prettify-html#comment55137594_27141132> > > > Using Sam's above code as an example, > > https://play.golang.org/p/JUqQY3WpW5 > > The above code format the following XML > > <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ > " > xmlns:ns="http://example.com/ns"> > <soapenv:Header/> > <soapenv:Body> > <ns:request> > <ns:customer> > <ns:id>123</ns:id> > <ns:name type="NCHZ">John Brown</ns:name> > </ns:customer> > </ns:request> > </soapenv:Body> > </soapenv:Envelope> > > > into this: > > <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" > xmlns:_xmlns="xmlns" _xmlns:soapenv=" > http://schemas.xmlsoap.org/soap/envelope/" _xmlns:ns=" > http://example.com/ns"> > <Header xmlns="http://schemas.xmlsoap.org/soap/envelope/"></Header> > <Body xmlns="http://schemas.xmlsoap.org/soap/envelope/"> > <request xmlns="http://example.com/ns"> > <customer xmlns="http://example.com/ns"> > <id xmlns="http://example.com/ns">123</id> > <name xmlns="http://example.com/ns" type="NCHZ">John Brown</name> > </customer> > </request> > </Body> > </Envelope> > > > I know they are the same in syntax, however they look totally different. > > Any way (e.g., to tweak encoding/xml) to make the beautified string look > closer to the original? >
FTR, trying to look into that direction myself, The dark voodoo regexp as described here works for many cases. http://www.perlmonks.org/?node_id=261292 $ echo '<root><this><is>a</is><test /><message><org><cn>Some org-or-other</cn><ph>Wouldnt you like to know</ph></org><contact><fn>Pat</fn><ln>Califia</ln></contact></message></this></root>' | perl -pe 's/(?<=>)\s+(?=<)//g; s(<(/?)([^/>]+)(/?)>\s*(?=(</?))?)($indent+=$3?0:$1?-1:1;"<$1$2$3>".($1&&($4 eq"</")?"\n".(" "x$indent):$4?"\n".(" "x$indent):""))ge' <root> <this> <is>a</is> <test /> <message> <org> <cn>Some org-or-other</cn> <ph>Wouldnt you like to know</ph> </org> <contact> <fn>Pat</fn> <ln>Califia</ln> </contact> </message> </this> </root> $ echo '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/ envelope/" xmlns:ns="http://example.com/ns"><soapenv:Header/><soapenv:Body><ns:request><ns:customer><ns:id>123</ns:id><ns:name type="NCHZ">John Brown</ns:name></ns:customer></ns:request></soapenv:Body></soapenv:Envelope>' | perl -pe 's/(?<=>)\s+(?=<)//g; s(<(/?)([^/>]+)(/?)>\s*(?=(</?))?)($indent+=$3?0:$1?-1:1;"<$1$2$3>".($1&&($4 eq"</")?"\n".(" "x$indent):$4?"\n".(" "x$indent):""))ge' <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://example.com/ns"><soapenv:Header/> <soapenv:Body> <ns:request> <ns:customer> <ns:id>123</ns:id> <ns:name type="NCHZ">John Brown</ns:name> </ns:customer> </ns:request> </soapenv:Body> </soapenv:Envelope> But I did found its own limits when trying more samples... -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.