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.

Reply via email to