[erlang-questions] how: xmerl export without "
Ulf Wiger
ulf@REDACTED
Thu Sep 19 10:31:20 CEST 2013
On 19 Sep 2013, at 09:34, Christoffer Vikström <cvi@REDACTED> wrote:
> As far as i know the xml standard doesn't allow for unquoted attribute values, which is probably why xmerl outputs it that way. No idea if you can game xmerl to output non-standard xml though.
>
> /Christoffer
The xmerl export requires only that the output is text, and one can always write an export callback that modifies an existing callback.
Here's one that seems to do roughly what Bengt wants (keeping the prolog unchanged, which may not matter, since the body is no longer proper XML):
-module(xml_wo_quotes).
-export(['#xml-inheritance#'/0]).
-export(['#element#'/5]).
'#xml-inheritance#'() -> [xmerl_xml].
'#element#'(Tag, Data, Attrs, Parents, E) ->
strip(xmerl_xml:'#element#'(Tag, Data, Attrs, Parents, E)).
strip([["<", Tag|T]|Rest]) ->
["<", Tag, strip_(T) | Rest];
strip(["<", Tag|T]) ->
["<", Tag | strip_(T)];
strip([H]) when is_list(H) ->
strip(H).
strip_(T) ->
{Attrs, Rest} = take_attrs(T),
[remove_quotes(Attrs), Rest].
take_attrs(L) ->
take_attrs(L, []).
take_attrs([H|_] = L, Acc) when H==">"; H=="/>" ->
{lists:reverse(Acc), L};
take_attrs([H|T], Acc) ->
take_attrs(T, [H|Acc]).
remove_quotes(L) ->
re:replace(L, "\\\"", "", [global]).
Example:
Eshell V5.9.2 (abort with ^G)
1> c(xml_wo_quotes).
{ok,xml_wo_quotes}
2> xmerl_scan:string("<?xml version=\"1.0\"?><foo a=\"1\" b=\"2\"><bar a=\"1\"/></foo>").
{{xmlElement,foo,foo,[],
{xmlNamespace,[],[]},
[],1,
[{xmlAttribute,a,[],[],[],[{foo,1}],1,[],"1",false},
{xmlAttribute,b,[],[],[],[{foo,1}],2,[],"2",false}],
[{xmlElement,bar,bar,[],
{xmlNamespace,[],[]},
[{foo,1}],
1,
[{xmlAttribute,a,[],[],[],
[{bar,1},{foo,...}],
1,[],
[...],...}],
[],[],"/Users/uwiger/src",undeclared}],
[],"/Users/uwiger/src",undeclared},
[]}
3> xmerl:export([element(1,v(2))], xml_wo_quotes).
["<?xml version=\"1.0\"?>",
[["<","foo",
[[<<" a=">>,[],<<"1">>,[],<<" b=">>,[],<<"2">>,[]],[">"]],
[["<","bar",[<<" a=">>,[],<<"1">>,[]],["/>"]]],
["</","foo",">"]]]]
4> io:fwrite("~s~n", [v(3)]).
<?xml version="1.0"?><foo a=1 b=2><bar a=1/></foo>
ok
BR,
Ulf
Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.
http://feuerlabs.com
More information about the erlang-questions
mailing list