Skip to content

Commit 4e1a3ed

Browse files
author
feeling
committed
proto
1 parent cb12559 commit 4e1a3ed

7 files changed

Lines changed: 254 additions & 21 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
eclipse.preferences.version=1
22
encoding//pyexcel2sc/Excel2sc.py=utf-8
33
encoding//pyexcel2sc/dataread.py=utf-8
4+
encoding//pyprotocol2sc/protocol2sc_main.py=utf-8

data/protocol/protocol.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Protocols xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:noNamespaceSchemaLocation="../../doc/protocol/Protocol.xsd">
4+
5+
<Protocol id="131001" name="demo" description="一个例子">
6+
<Request type="C2G">
7+
<DataGroup>
8+
<ItemComplexField name="monster_info" description="怪物信息">
9+
<ItemSingleField name="monster_pos" type="B" description=""/>
10+
</ItemComplexField>
11+
</DataGroup>
12+
</Request>
13+
<Response type="G2C">
14+
<Result code="" reason="" msg=""/>
15+
<Null />
16+
</Response>
17+
</Protocol>
18+
</Protocols>
19+

data/protocol/schema/Protocol.xsd

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,23 @@
5050
</xs:element>
5151
<xs:element name="Protocol">
5252
<xs:complexType>
53-
<xs:sequence>
53+
<xs:all>
5454
<xs:element name="Request">
5555
<xs:complexType>
5656
<xs:choice>
5757
<xs:element ref="Null"/>
58-
<xs:element ref="ItemArray"/>
59-
<xs:element ref="ItemList"/>
60-
<xs:element ref="ItemComplexField"/>
61-
<xs:element ref="ItemSingleField"/>
58+
<xs:choice>
59+
<xs:element ref="DataGroup"/>
60+
</xs:choice>
6261
</xs:choice>
63-
<xs:attribute name="type" use="required"/>
62+
<xs:attribute name="type" use="required">
63+
<xs:simpleType>
64+
<xs:restriction base="xs:string">
65+
<xs:enumeration value="C2G"/>
66+
<xs:enumeration value="C2MSG"/>
67+
</xs:restriction>
68+
</xs:simpleType>
69+
</xs:attribute>
6470
</xs:complexType>
6571
</xs:element>
6672
<xs:element name="Response">
@@ -75,29 +81,34 @@
7581
</xs:element>
7682
<xs:choice>
7783
<xs:element ref="Null"/>
78-
<xs:element ref="ItemArray"/>
79-
<xs:element ref="ItemList"/>
80-
<xs:element ref="ItemComplexField"/>
81-
<xs:element ref="ItemSingleField"/>
84+
<xs:element ref="DataGroup"/>
8285
</xs:choice>
8386
</xs:sequence>
84-
<xs:attribute name="type" use="required"/>
87+
<xs:attribute name="type" use="required">
88+
<xs:simpleType>
89+
<xs:restriction base="xs:string">
90+
<xs:enumeration value="G2C"/>
91+
<xs:enumeration value="MSG2C"/>
92+
</xs:restriction>
93+
</xs:simpleType>
94+
</xs:attribute>
8595
</xs:complexType>
8696
</xs:element>
87-
</xs:sequence>
97+
</xs:all>
8898
<xs:attribute name="id" type="xs:long" use="required"/>
8999
<xs:attribute name="name" type="xs:string" use="required"/>
90100
<xs:attribute name="description" use="required"/>
91101
</xs:complexType>
92102
</xs:element>
93-
<xs:complexType name="DataGroup">
94-
<xs:choice>
95-
<xs:element name="Null"/>
96-
<xs:element ref="ItemArray"/>
97-
<xs:element ref="ItemList"/>
98-
<xs:element ref="ItemComplexField"/>
99-
<xs:element ref="ItemSingleField"/>
100-
</xs:choice>
101-
</xs:complexType>
103+
<xs:element name="DataGroup">
104+
<xs:complexType>
105+
<xs:choice>
106+
<xs:element ref="ItemArray"/>
107+
<xs:element ref="ItemComplexField"/>
108+
<xs:element ref="ItemList"/>
109+
<xs:element ref="ItemSingleField"/>
110+
</xs:choice>
111+
</xs:complexType>
112+
</xs:element>
102113
<xs:element name="Null"/>
103114
</xs:schema>

pyprotocol2sc/__init__.py

Whitespace-only changes.

pyprotocol2sc/protocol.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
'''
5+
Created on 2012-12-19
6+
7+
@author: hill
8+
'''
9+
class Protocol():
10+
request = None
11+
response = None
12+
13+
class ProtocolRequest():
14+
type = None
15+
data_list = []
16+
17+
class ProtocolResponse():
18+
type = None
19+
result = None
20+
data_list = []
21+
22+
class ProtocolDataNull():
23+
pass
24+
25+
class ProtocolDataResult():
26+
code = None
27+
reason = None
28+
msg = None
29+
30+
class ProtocolDataItemArray():
31+
name = None
32+
description = None
33+
item_list = []
34+
35+
class ProtocolDataItemList():
36+
name = None
37+
description = None
38+
item_list = []
39+
40+
class ProtocolDataItemSingelField():
41+
name = None
42+
type = None
43+
description = None
44+
45+
class ProtocolDataItemComplexField():
46+
name = None
47+
description = None
48+
field_dict = {}

pyprotocol2sc/protocol2sc_main.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
#!/usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
'''
5+
Created on 2012-12-19
6+
7+
@author: hill
8+
'''
9+
from pyprotocol2sc.xmltool import *
10+
from xml.dom import minidom
11+
from pyprotocol2sc.protocol import Protocol, ProtocolRequest, ProtocolResponse,\
12+
ProtocolDataNull, ProtocolDataItemArray, ProtocolDataItemSingelField,\
13+
ProtocolDataItemList, ProtocolDataItemComplexField, ProtocolDataResult
14+
15+
def parseProtocol(protocol_node, protocol):
16+
protocol.id = protocol_node.attributes['id'].value
17+
protocol.name = protocol_node.attributes['name'].value
18+
protocol.description = protocol_node.attributes['description'].value
19+
request_node = get_first_node_by_name(protocol_node, 'Request')
20+
if request_node:
21+
protocol.request = ProtocolRequest()
22+
parseRequest(request_node, protocol.request)
23+
response_node = get_first_node_by_name(protocol_node, 'Response')
24+
if response_node:
25+
protocol.response = ProtocolResponse()
26+
parseResponse(response_node, protocol.response)
27+
28+
def parseRequest(request_node, request):
29+
children = request_node.childNodes
30+
request.type = request_node.attributes['type'].value
31+
for node in children:
32+
if node.nodeName == 'DataGroup':
33+
parseDataGroup(node, request)
34+
elif node.nodeName == 'Null':
35+
parseNull(node, request)
36+
37+
38+
def parseResponse(response_node, response):
39+
children = response_node.childNodes
40+
response.type = response_node.attributes['type'].value
41+
for node in children:
42+
if node.nodeName == 'DataGroup':
43+
parseDataGroup(node, response)
44+
elif node.nodeName == 'Null':
45+
parseNull(node, response)
46+
elif node.nodeName == 'Result':
47+
parseResult(node, response)
48+
49+
def parseResult(node, response):
50+
result = ProtocolDataResult()
51+
result.code = node.attributes['code'].value
52+
result.reason = node.attributes['reason'].value
53+
result.msg = node.attributes['msg'].value
54+
response.result = result
55+
56+
def parseDataGroup(dataGroupNode, data_contrainer):
57+
data_list = data_contrainer.data_list
58+
children = dataGroupNode.childNodes
59+
for node in children:
60+
if node.nodeName == 'ItemArray':
61+
data_list.append(parseDataTtemArray(node))
62+
elif node.nodeName == 'ItemList':
63+
data_list.append(parseDataItemList(node))
64+
elif node.nodeName == 'ItemSingleField':
65+
data_list.append(parseDataItemSingleField(node))
66+
elif node.nodeName == 'ItemComplexField':
67+
data_list.append(parseDataItemComplexField(node))
68+
69+
def parseNull(node, data_contrainer):
70+
data_contrainer.data_list.append(ProtocolDataNull())
71+
72+
def parseDataTtemArray(itemArrayNode):
73+
children = itemArrayNode.childNodes
74+
item_array = ProtocolDataItemArray()
75+
item_array.name = itemArrayNode.attributes['name'].value
76+
item_array.description = itemArrayNode.attributes['description'].value
77+
for node in children:
78+
if node.nodeName == 'ItemSingleField':
79+
item_array.append(parseDataItemSingleField(node, item_array.item_list))
80+
return item_array
81+
82+
def parseDataItemSingleField(itemSingleFieldNode):
83+
item_single_field = ProtocolDataItemSingelField()
84+
item_single_field.name = itemSingleFieldNode.attributes['name'].value
85+
item_single_field.type = itemSingleFieldNode.attributes['type'].value
86+
item_single_field.description = itemSingleFieldNode.attributes['description'].value
87+
return item_single_field
88+
89+
def parseDataItemComplexField(itemComplexFieldNode):
90+
item_complex_field = ProtocolDataItemComplexField()
91+
field_dict = item_complex_field.field_dict
92+
children = itemComplexFieldNode.childNodes
93+
item_complex_field.name = itemComplexFieldNode.attributes['name'].value
94+
item_complex_field.description = itemComplexFieldNode.attributes['description'].value
95+
for node in children:
96+
if node.nodeName == 'ItemArray':
97+
name = node.attributes['name'].value
98+
field_dict[name]=parseDataTtemArray(node)
99+
elif node.nodeName == 'ItemList':
100+
name = node.attributes['name'].value
101+
field_dict[name]=parseDataItemList(node)
102+
elif node.nodeName == 'ItemSingleField':
103+
name = node.attributes['name'].value
104+
field_dict[name]=parseDataItemSingleField(node)
105+
elif node.nodeName == 'ItemComplexField':
106+
name = node.attributes['name'].value
107+
field_dict[name]=parseDataItemComplexField(node)
108+
return item_complex_field
109+
110+
def parseDataItemList(itemListNode):
111+
children = itemListNode.childNodes
112+
item_list = ProtocolDataItemList()
113+
item_list.name = itemListNode.attributes['name'].value
114+
item_list.description = itemListNode.attributes['description'].value
115+
for node in children:
116+
if node.nodeName == 'ItemComplexField':
117+
item_list.item_list.append(parseDataItemComplexField(node))
118+
return item_list
119+
120+
def parse_xml(xml_file):
121+
doc = minidom.parse(xml_file)
122+
root = doc.documentElement
123+
protocol_nodes = get_nodes_by_name(root,'Protocol')
124+
for protocol_node in protocol_nodes:
125+
protocol = Protocol()
126+
parseProtocol(protocol_node, protocol)
127+
print protocol
128+
129+
def main():
130+
parse_xml('../data/protocol/protocol.xml')
131+
132+
133+
if __name__ == '__main__':
134+
main()

pyprotocol2sc/xmltool.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
'''
5+
Created on 2012-12-19
6+
7+
@author: hill
8+
'''
9+
def get_attrvalue(node, attrname):
10+
return node.getAttribute(attrname) if node else ''
11+
12+
def get_nodevalue(node, index = 0):
13+
return node.childNodes[index].nodeValue if node else ''
14+
15+
def get_nodes_by_name(node,name):
16+
return node.getElementsByTagName(name) if node else []
17+
18+
def get_first_node_by_name(node,name):
19+
nodes = get_nodes_by_name(node,name)
20+
return nodes[0] if nodes else None

0 commit comments

Comments
 (0)