123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/python
-
- #
- # A mini-parser to be used where properl XPath tool is not available
- #
-
- import os
- import sys
- import StringIO
-
- import libxml2
-
-
- STATUS_NOMATCH = 1
- STATUS_USAGE = 2
-
- MATCH_FMT = os.environ.get('MATCH_FMT', '%s\n')
-
-
- def usage():
- sys.stderr.write("usage: ./poorxpath //XPATH/EXPR"
- " /path/to/result.xml [ns_name:ns_url]...\n")
- sys.exit(STATUS_USAGE)
-
-
- def debug(*msgs):
- if os.environ.get('DEBUG') == '1':
- [sys.stderr.write('debug: %s\n' % msg) for msg in msgs]
-
-
- def write(body, origin):
- debug('----- BEGIN MATCH (%s) -----' % origin.__class__,
- body,
- '----- END MATCH (%s) -----' % origin.__class__)
- sys.stdout.write(MATCH_FMT % body)
-
-
- if __name__ == '__main__':
-
- try:
- expr = sys.argv[1]
- file = sys.argv[2]
- except IndexError:
- usage()
-
- namespaces = []
- for arg in sys.argv[3:]:
- name, url = arg.split(':', 1)
- namespaces.append((name, url))
-
- doc = libxml2.parseFile(file)
- context = doc.xpathNewContext()
- [context.xpathRegisterNs(n, u) for n, u in namespaces]
- matches = context.xpathEvalExpression(expr)
- debug('expr=%r' % expr,
- 'matches=%r' % matches)
-
- if isinstance(matches, str):
- write(matches, matches)
- else:
- if not matches:
- sys.exit(STATUS_NOMATCH)
- for match in matches:
- if isinstance(match, libxml2.xmlAttr):
- write(match.content, match)
- else:
- # value = match.serialize()
- # debug('value=%r' % value)
- write(match.serialize(), match)
|