1

値 (文字列、リスト、辞書) を持つ辞書があります。その辞書を xml 形式の文字列に変換したいと考えています。

含まれる値は、サブディクショナリとリスト (固定形式ではありません) の場合があります。だから私はdictからすべての値を取得し、組み込み関数(xmlのインポート、ElementTreeなど)を使用せずにxml文字列を形成したいと考えています。

例えば:

入力:

{'Employee':{ 'Id' : 'TA23434', 'Name':'Kesavan' , 'Email':'k7@gmail.com' , 'Roles':[ {'Name':'Admin' ,'RoleId':'xa1234' },{'Name':'Engineer' , 'RoleId':'xa5678' }], 'Test':{'a':'A','b':'b'} }}

出力は次のようになります。

<Employee>
       <Id>TA23434</Id>
       <Name>Kesaven</Name>
       <Email>, ..... </Email>
       <Roles>
             <Roles-1>
                         <Name>Admin</Name>
                         <RoleId>xa1234</RoleId>
             </Roles-1>
             <Roles-2>
                         <Name>Admin</Name>
                         <RoleId>xa1234</RoleId>
             </Roles-2>
       <Roles>
       <Test>
             <a>A</a>
         <b>B</b>
       </Test>  
</Employee>

誰でもこれを行うのに簡単な方法についてアドバイスできますか。

4

1 に答える 1

1

次のようなものを使用できます。

def to_tag(k, v):
    """Create a new tag for the given key k and value v"""
    return '<{key}>{value}<{key}/>'.format(key=k, value=get_content(k, v))

def get_content(k, v):
    """Create the content of a tag by deciding what to do depending on the content of the value"""
    if isinstance(v, str):
        # it's a string, so just return the value
        return v
    elif isinstance(v, dict):
        # it's a dict, so create a new tag for each element
        # and join them with newlines
        return '\n%s\n' % '\n'.join(to_tag(*e) for e in v.items())
    elif isinstance(v, list):
        # it's a list, so create a new key for each element
        # by using the enumerate method and create new tags
        return '\n%s\n' % '\n'.join(to_tag('{key}-{value}'.format(key=k, value=i+1), e) for i, e in enumerate(v))

d = {'Employee':{ 'Id' : 'TA23434', 'Name':'Kesavan' , 'Email':'k7@gmail.com' , 'Roles':[ {'Name':'Admin' ,'RoleId':'xa1234' },{'Name':'Engineer' , 'RoleId':'xa5678' }], 'Test':{'a':'A','b':'b'} }}

for k,v in d.items():
    print to_tag(k, v)

いくつかのコメントを追加しましたが、何が起こっているのかは明らかであり、開始するには十分なはずです。

dicts は Python では順序付けされていないため、結果の XML も順序付けられていません。

結果:

<Employee>
<Email>k7@gmail.com<Email/>
<Test>
<a>A<a/>
<b>b<b/>
<Test/>
<Id>TA23434<Id/>
<Roles>
<Roles-1>
<RoleId>xa1234<RoleId/>
<Name>Admin<Name/>
<Roles-1/>
<Roles-2>
<RoleId>xa5678<RoleId/>
<Name>Engineer<Name/>
<Roles-2/>
<Roles/>
<Name>Kesavan<Name/>
<Employee/>
于 2012-10-10T12:54:43.207 に答える