Skip to content

Instantly share code, notes, and snippets.

@podhmo
Last active August 29, 2015 13:56
Show Gist options
  • Save podhmo/9091886 to your computer and use it in GitHub Desktop.
Save podhmo/9091886 to your computer and use it in GitHub Desktop.
# -*- coding:utf-8 -*-
import logging
logger = logging.getLogger(__name__)
from collections import namedtuple
from io import StringIO
import sys
import json
class Converter(object):
def convert(self, v):
if isinstance(v, str):
return unicode(v)
elif isinstance(v, unicode):
return v
else:
return json.dumps(v)
class Writer(object):
padding = 2
namespace_fmt = "clr-namespace:{}"
def __init__(self, name, namespace="Application", prefix="l", converter=None, parents=None):
if parents:
self.names = parents[:]
self.names.append(name)
else:
self.names = [name]
self.namespace = self.namespace_fmt.format(namespace)
self.prefix = prefix
self.converter = Converter()
def write_list(self, names, xs, io, indent):
for v in xs:
self.write_internal(names, v, io=io, indent=indent)
def write_dict(self, names, doc, io, indent):
padding = " "*indent
clsname = names[0]
fmt = u"{padding}<{prefix}:{clsname}.{property}>{value}</{prefix}:{clsname}.{property}>\n"
for k, v in doc.items():
if isinstance(v, (tuple, list)):
io.write(u"{padding}<{prefix}:{clsname}.{property}>\n".format(padding=padding, prefix=self.prefix, clsname=clsname, property=k))
self.write_list(names[1:], v, io, indent+2)
io.write(u"{padding}</{prefix}:{clsname}.{property}>\n".format(padding=padding, prefix=self.prefix, clsname=clsname, property=k))
elif hasattr(v, "items"):
io.write(u"{padding}<{prefix}:{clsname}.{property}>\n".format(padding=padding, prefix=self.prefix, clsname=clsname, property=k))
self.write_dict(names[1:], v, io, indent+2)
io.write(u"{padding}</{prefix}:{clsname}.{property}>\n".format(padding=padding, prefix=self.prefix, clsname=clsname, property=k))
else:
v = self.converter.convert(v)
io.write(fmt.format(padding=padding, prefix=self.prefix, clsname=clsname, property=k, value=v))
def write_value(self, names, doc, io, indent):
if hasattr(doc, "items"):
self.write_dict(names, doc, io, indent)
elif isinstance(doc, (tuple, list)):
self.write_list(names[1:], doc, io, indent)
else:
raise Exception("x")
def write_internal(self, names, doc, io, indent):
padding = " "*indent
clsname = names[0]
io.write(u'{padding}<{prefix}:{clsname}>\n'.format(prefix=self.prefix, clsname=clsname, padding=padding))
self.write_value(names, doc, io, indent+2)
io.write(u'{padding}</{prefix}:{clsname}>\n'.format(prefix=self.prefix, clsname=clsname, padding=padding))
def write(self, doc, io=sys.stdout):
clsname = self.names[0]
io.write(u'<{prefix}:{clsname} xmlns:{prefix}="{namespace}">\n'.format(prefix=self.prefix, clsname=clsname, namespace=self.namespace))
self.write_value(self.names, doc, io, 2)
io.write(u'</{prefix}:{clsname}>\n'.format(prefix=self.prefix, clsname=clsname))
def json2xaml(clsname, namespace, data, parents=None):
writer = Writer(clsname, namespace=namespace, parents=parents)
io = StringIO()
writer.write(data, io=io)
return io.getvalue()
print(json2xaml("DummyModel", "Application", {"Name": "foo", "Age": 10, "IsActive": True}))
vals = [
{"Name": "foo", "Age": 10, "IsActive": True},
{"Name": "foo", "Age": 10, "IsActive": True}
]
print(json2xaml("DummyModel", "Application", vals, parents=["DummyModelCollection"]))
vals = {"xs": [
{"item": {"name": "foo", "value": 1}},
{"item": {"name": "bar", "value": 2}}
]}
print(json2xaml("Item", "App", vals, parents=["Dummy", "Coll"]))
@podhmo
Copy link
Author

podhmo commented Feb 19, 2014

<l:DummyModel xmlns:l="clr-namespace:Application">
  <l:DummyModel.Age>10</l:DummyModel.Age>
  <l:DummyModel.Name>foo</l:DummyModel.Name>
  <l:DummyModel.IsActive>true</l:DummyModel.IsActive>
</l:DummyModel>

<l:DummyModelCollection xmlns:l="clr-namespace:Application">
  <l:DummyModel>
    <l:DummyModel.Age>10</l:DummyModel.Age>
    <l:DummyModel.Name>foo</l:DummyModel.Name>
    <l:DummyModel.IsActive>true</l:DummyModel.IsActive>
  </l:DummyModel>
  <l:DummyModel>
    <l:DummyModel.Age>10</l:DummyModel.Age>
    <l:DummyModel.Name>foo</l:DummyModel.Name>
    <l:DummyModel.IsActive>true</l:DummyModel.IsActive>
  </l:DummyModel>
</l:DummyModelCollection>

@podhmo
Copy link
Author

podhmo commented Feb 19, 2014

名前dict2xamlにすれば良かった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment