def get_options(): optParser = OptionParser(usage=os.path.basename(sys.argv[0]) + " [<options>] <input_file_or_port>") optParser.add_option("-p", "--protodir", default=".", help="where to put and read .proto files") optParser.add_option("-x", "--xsd", help="xsd schema to use (mandatory)") optParser.add_option("-a", "--validation", action="store_true", default=False, help="enable schema validation") optParser.add_option("-o", "--output", help="output file name") options, args = optParser.parse_args() if len(args) != 1: optParser.print_help() sys.exit() if not options.xsd: print("a schema is mandatory", file=sys.stderr) sys.exit() if options.validation and not haveLxml: print("lxml not available, skipping validation", file=sys.stderr) options.validation = False if args[0].isdigit(): options.source = xml2csv.getSocketStream(int(args[0])) else: options.source = args[0] if not options.output: options.output = os.path.splitext(args[0])[0] + ".protomsg" return options
def write_xml(toptag, tag, options, printer=row2xml): with open(options.output, 'w') as outputf: outputf.write('<%s>\n' % toptag) if (options.source.isdigit()): inputf = xml2csv.getSocketStream(int(options.source)) else: inputf = open(options.source) for row in csv.DictReader(inputf, delimiter=options.delimiter): outputf.write(printer(row, tag)) outputf.write('</%s>\n' % toptag)
def write_xml(toptag, tag, options, printer=row2xml): with io.open(options.output, 'w', encoding="utf8") as outputf: outputf.write(u'<%s>\n' % toptag) if options.source.isdigit(): inputf = xml2csv.getSocketStream(int(options.source)) else: inputf = io.open(options.source, encoding="utf8") reader = csv.DictReader(inputf, delimiter=options.delimiter) for row in reader: orderedRow = OrderedDict([(key, row[key]) for key in reader.fieldnames]) outputf.write(printer(orderedRow, tag)) outputf.write(u'</%s>\n' % toptag)
def writeHierarchicalXml(struct, options): if not struct.root.attributes: options.skip_root = True with contextlib.closing(xml2csv.getOutStream(options.output)) as outputf: if options.source.isdigit(): inputf = xml2csv.getSocketStream(int(options.source)) else: inputf = open(options.source) lastRow = OrderedDict() tagStack = [struct.root.name] if options.skip_root: if (PY3): outputf.write(str.encode('<%s' % struct.root.name)) else: outputf.write('<%s' % struct.root.name) fields = None enums = {} first = True for raw in csv.reader(inputf, delimiter=options.delimiter): if not fields: fields = raw for f in fields: if not '_' in f: continue enum = struct.getEnumerationByAttr(*f.split('_', 1)) if enum: enums[f] = enum else: row = OrderedDict() for field, entry in zip(fields, raw): if field in enums and entry.isdigit(): entry = enums[field][int(entry)] row[field] = entry if first and not options.skip_root: checkAttributes(outputf, lastRow, row, struct.root, tagStack, 0) first = False checkChanges(outputf, lastRow, row, struct.root, tagStack, 1) lastRow = row outputf.write(str.encode("/>\n")) for idx in range(len(tagStack) - 2, -1, -1): if (PY3): outputf.write( str.encode("%s</%s>\n" % (idx * ' ', tagStack[idx]))) else: outputf.write("%s</%s>\n" % (idx * ' ', tagStack[idx]))
def writeHierarchicalXml(struct, options): if not struct.root.attributes: options.skip_root = True with contextlib.closing(xml2csv.getOutStream(options.output)) as outputf: if options.source.isdigit(): inputf = xml2csv.getSocketStream(int(options.source)) else: inputf = open(options.source) lastRow = OrderedDict() tagStack = [struct.root.name] if options.skip_root: if(PY3): outputf.write(str.encode('<%s' % struct.root.name)) else: outputf.write('<%s' % struct.root.name) fields = None enums = {} first = True for raw in csv.reader(inputf, delimiter=options.delimiter): if not fields: fields = raw for f in fields: if '_' not in f: continue enum = struct.getEnumerationByAttr(*f.split('_', 1)) if enum: enums[f] = enum else: row = OrderedDict() for field, entry in zip(fields, raw): if field in enums and entry.isdigit(): entry = enums[field][int(entry)] row[field] = entry if first and not options.skip_root: checkAttributes( outputf, lastRow, row, struct.root, tagStack, 0) first = False checkChanges(outputf, lastRow, row, struct.root, tagStack, 1) lastRow = row outputf.write(str.encode("/>\n")) for idx in range(len(tagStack) - 2, -1, -1): if(PY3): outputf.write( str.encode("%s</%s>\n" % (idx * ' ', tagStack[idx]))) else: outputf.write("%s</%s>\n" % (idx * ' ', tagStack[idx]))
def writeXml(root, module, options): with contextlib.closing(xml2csv.getOutStream(options.output)) as outputf: outputf.write('<?xml version="1.0" encoding="UTF-8"?>\n\n<%s' % root) if options.source.isdigit(): inp = xml2csv.getSocketStream(int(options.source)) else: inp = open(options.source, 'rb') with contextlib.closing(inp) as inputf: first = True while True: length = struct.unpack('>L', read_n(inputf, 4))[0] if length == 0: break obj = vars(module)[root.capitalize()]() obj.ParseFromString(read_n(inputf, length)) for attr, value in obj.ListFields(): if attr.type == google.protobuf.descriptor.FieldDescriptor.TYPE_MESSAGE: if attr.label == google.protobuf.descriptor.FieldDescriptor.LABEL_REPEATED: for item in value: msg2xml(attr, item, outputf) elif first: outputf.write(' %s="%s"' % (attr.name, value)) first = False outputf.write(">\n</%s>\n" % root)