XML Parser

class TreeNode(object):
def __init__(self, content):
self.content = content
self.children = []


def add_child(self, node):
self.children.append(node)


def XMLElementParser(XMLString, begin):
begin_pos = 0
for i in range(begin, len(XMLString)):
if XMLString[i] == '<':
begin_pos = i
break
end_pos = begin_pos
for i in range(begin_pos + 1, len(XMLString)):
if XMLString[i] == '>':
end_pos = i
break
if XMLString[begin_pos+1] == '?':
if XMLString[end_pos - 1] != '?':
raise Exception('invalid comment')
else:
return end_pos, '', 0
elif XMLString[end_pos - 1] == '/':
content = XMLString[begin_pos + 1: end_pos - 1]
content = content.strip()
element = content.split(' ')[0]
return end_pos, element, 1
elif XMLString[begin_pos + 1] == '/':
content = XMLString[begin_pos + 2: end_pos]
content = content.strip()
element = content.split(' ')[0]
return end_pos, element, 2
else:
content = XMLString[begin_pos + 1: end_pos]
content = content.strip()
element = content.split(' ')[0]
return end_pos, element, 3


def XMLParser(XMLString):
status = 0
end_pos = 0
element = ''
while status == 0:
end_pos, element, status = XMLElementParser(XMLString, end_pos)
end_pos = end_pos + 1
parse_stack = []
root = TreeNode(element)
parse_stack.append(root)
while len(parse_stack) > 0:
end_pos, element, status = XMLElementParser(XMLString, end_pos)
end_pos = end_pos + 1
if status == 0:
continue
elif status == 1:
node = TreeNode(element)
parse_stack[-1].add_child(node)
elif status == 2:
if element != parse_stack[-1].content:
raise Exception('tag mismatch')
else:
parse_stack = parse_stack[:-1]
elif status == 3:
node = TreeNode(element)
parse_stack[-1].add_child(node)
parse_stack.append(node)
return root
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值