xmldoc2json-3.0.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/python
  2. import sys
  3. import xml.etree.ElementTree as ET
  4. import json
  5. import os
  6. def glob_path(path, pattern):
  7. import os, fnmatch
  8. result = []
  9. for root, _, files in os.walk(path):
  10. for filename in files:
  11. if fnmatch.fnmatch(filename, pattern):
  12. result.append(os.path.join(root, filename))
  13. return result
  14. def parseClass(data):
  15. dictCls = dict(data.attrib)
  16. dictCls['brief_description'] = data.find("brief_description").text.strip()
  17. dictCls['description'] = data.find("description").text.strip()
  18. dictCls['methods'] = []
  19. for m in data.find("methods"):
  20. dictCls['methods'].append(parseMethod(m))
  21. dictCls['signals'] = []
  22. for s in (data.find("signals") if data.find("signals") is not None else []):
  23. dictCls['signals'].append(parseMethod(s))
  24. dictCls['constants'] = []
  25. for c in (data.find("constants") if data.find("constants") is not None else []):
  26. dictCls['constants'].append(parseConstant(c))
  27. dictCls['properties'] = []
  28. for m in (data.find("members") if data.find("members") is not None else []):
  29. dictCls['properties'].append(parseProperty(m))
  30. dictCls['theme_properties'] = []
  31. for thi in (data.find("theme_items") if data.find("theme_items") is not None else []):
  32. dictCls['theme_properties'].append(parseProperty(thi))
  33. return dictCls
  34. def parseMethod(data):
  35. dictMethod = dict(data.attrib)
  36. dictMethod['description'] = data.find("description").text.strip()
  37. dictMethod['return_type'] = data.find("return").attrib["type"] if data.find("return") is not None else ""
  38. if "qualifiers" not in dictMethod: dictMethod["qualifiers"] = ""
  39. dictMethod["arguments"] = []
  40. for arg in data.iter('argument'):
  41. dictMethod["arguments"].append(parseArgument(arg))
  42. return dictMethod
  43. def parseArgument(data):
  44. dictArg = dict(data.attrib)
  45. if "dictArg" in dictArg: dictArg.pop("index")
  46. dictArg["default_value"] = dictArg["default"] if "default" in dictArg else ""
  47. if "default" in dictArg: dictArg.pop("default")
  48. return dictArg
  49. def parseConstant(data):
  50. dictConst = dict(data.attrib)
  51. dictConst["description"] = data.text.strip()
  52. return dictConst
  53. def parseProperty(data):
  54. dictProp = dict(data.attrib)
  55. dictProp["description"] = data.text.strip()
  56. return dictProp
  57. def main():
  58. if len(sys.argv) >=2 :
  59. if os.path.isdir(sys.argv[1]):
  60. classes = {}
  61. for f in glob_path(sys.argv[1], "**.xml"):
  62. if f.find("/classes/") == -1 and f.find("/doc_classes/") == -1:
  63. continue
  64. tree = ET.parse(open(f, 'r'))
  65. cls = tree.getroot()
  66. dictCls = parseClass(cls)
  67. classes[dictCls['name']] = dictCls
  68. jsonContent = json.dumps({"classes": classes, "version": "3.0.4"}, ensure_ascii=False, indent=2)
  69. print(jsonContent)
  70. if __name__ == '__main__':
  71. main()