コード例 #1
0
def load(filename, validate=True):
    """Generate a python object

    :param filename: the XML filename we should load
    :param validate: validate the XML before generating the python object.
    :type filename: str
    :type validate: bool
    :return: the generated python object
    :rtype: :class:`Element`
    """
    tree = etree.parse(filename)
    dtd_url = tree.docinfo.system_url
    path = isinstance(filename,
                      basestring) and os.path.dirname(filename) or None
    dtd_str = utils.get_dtd_content(dtd_url, path)
    if validate:
        utils.validate_xml(tree, dtd_str)

    dic = dtd_parser.parse(dtd_str=dtd_str,
                           cache_key='xmltool.parse.%s' % dtd_url)
    root = tree.getroot()
    obj = dic[root.tag]()
    obj.load_from_xml(root)
    obj.filename = filename
    obj.dtd_url = dtd_url
    obj.encoding = tree.docinfo.encoding
    return obj
コード例 #2
0
ファイル: factory.py プロジェクト: samjy/xmltool
def load(filename, validate=True):
    """Generate a python object

    :param filename: the XML filename we should load
    :param validate: validate the XML before generating the python object.
    :type filename: str
    :type validate: bool
    :return: the generated python object
    :rtype: :class:`Element`
    """
    tree = etree.parse(filename)
    dtd_url = tree.docinfo.system_url
    path = isinstance(filename, basestring) and os.path.dirname(filename) or None
    dtd_str = utils.get_dtd_content(dtd_url, path)
    if validate:
        utils.validate_xml(tree, dtd_str)

    dic = dtd_parser.parse(dtd_str=dtd_str)
    root = tree.getroot()
    obj = dic[root.tag]()
    obj.load_from_xml(root)
    obj._xml_filename = filename
    obj._xml_dtd_url = dtd_url
    obj._xml_encoding = tree.docinfo.encoding
    return obj
コード例 #3
0
    def write(self,
              filename=None,
              encoding=None,
              dtd_url=None,
              validate=True,
              transform=None):
        filename = filename or self._xml_filename
        if not filename:
            raise Exception('No filename given')
        dtd_url = dtd_url or self._xml_dtd_url
        if not dtd_url:
            raise Exception('No dtd url given')
        encoding = encoding or self._xml_encoding or DEFAULT_ENCODING
        xml = self.to_xml()
        if validate:
            dtd_str = utils.get_dtd_content(dtd_url, os.path.dirname(filename))
            utils.validate_xml(xml, dtd_str)

        doctype = ('<!DOCTYPE %(root_tag)s SYSTEM "%(dtd_url)s">' % {
            'root_tag': self._tagname,
            'dtd_url': dtd_url,
        })
        xml_str = etree.tostring(xml.getroottree(),
                                 pretty_print=True,
                                 xml_declaration=True,
                                 encoding=encoding,
                                 doctype=doctype)
        if transform:
            xml_str = transform(xml_str)
        open(filename, 'w').write(xml_str)
コード例 #4
0
def _parse(dtd_str=None, dtd_url=None, path=None):
    if not dtd_str and not dtd_url:
        raise ValueError('You didn\'t provide dtd_str nor dtd_url')

    if dtd_str and dtd_url:
        raise ValueError('You should provide either dtd_str or dtd_url')

    if dtd_url:
        dtd_str = utils.get_dtd_content(dtd_url, path)

    dtd_dict = dtd_to_dict_v2(dtd_str)
    return _create_classes(dtd_dict)
コード例 #5
0
def _parse(dtd_str=None, dtd_url=None, path=None):
    if not dtd_str and not dtd_url:
        raise ValueError('You didn\'t provide dtd_str nor dtd_url')

    if dtd_str and dtd_url:
        raise ValueError('You should provide either dtd_str or dtd_url')

    if dtd_url:
        dtd_str = utils.get_dtd_content(dtd_url, path)

    dtd_dict = dtd_to_dict_v2(dtd_str)
    return _create_classes(dtd_dict)
コード例 #6
0
ファイル: dtd_parser.py プロジェクト: samjy/xmltool
def parse(dtd_str=None, dtd_url=None):
    # TODO: try to put a cache on this function
    if not dtd_str and not dtd_url:
        raise ValueError, 'You didn\'t provide dtd_str nor dtd_url'

    if dtd_str and dtd_url:
        raise ValueError, 'You should provide either dtd_str or dtd_url'

    if dtd_url:
        dtd_str = utils.get_dtd_content(dtd_url)

    dtd_dict = dtd_to_dict_v2(dtd_str)
    return _create_classes(dtd_dict)
コード例 #7
0
ファイル: elements.py プロジェクト: bradfordjns/Maps
    def write(self,
              filename=None,
              encoding=None,
              dtd_url=None,
              dtd_str=None,
              validate=True,
              transform=None):
        filename = filename or self.filename
        if not filename:
            raise Exception('No filename given')
        dtd_url = dtd_url or self.dtd_url
        dtd_str = dtd_str or self.dtd_str
        if not dtd_url and not dtd_str:
            raise Exception('No dtd given')
        encoding = encoding or self.encoding or DEFAULT_ENCODING
        xml = self.to_xml()
        if validate:
            if not dtd_str:
                dtd_str = utils.get_dtd_content(dtd_url,
                                                os.path.dirname(filename))
            utils.validate_xml(xml, dtd_str)

        doctype = '<!DOCTYPE %(root_tag)s SYSTEM "%(dtd_url)s">' % {
            'root_tag': self.tagname,
            'dtd_url': dtd_url
        }

        # Some etree versions are not valid according to StrictVersion so we
        # split it.
        etree_version = '.'.join(etree.__version__.split('.')[:2])
        if StrictVersion(etree_version) < StrictVersion('2.3'):
            xml_str = etree.tostring(
                xml.getroottree(),
                pretty_print=True,
                xml_declaration=True,
                encoding=encoding,
            )
            xml_str = xml_str.replace('<%s' % self.tagname,
                                      '%s\n<%s' % (doctype, self.tagname))
        else:
            xml_str = etree.tostring(xml.getroottree(),
                                     pretty_print=True,
                                     xml_declaration=True,
                                     encoding=encoding,
                                     doctype=doctype)
        if transform:
            xml_str = transform(xml_str)
        open(filename, 'w').write(xml_str)
コード例 #8
0
    def write(self, filename=None, encoding=None, dtd_url=None, dtd_str=None,
              validate=True,
              transform=None):
        filename = filename or self.filename
        if not filename:
            raise Exception('No filename given')
        dtd_url = dtd_url or self.dtd_url
        dtd_str = dtd_str or self.dtd_str
        if not dtd_url and not dtd_str:
            raise Exception('No dtd given')
        encoding = encoding or self.encoding or DEFAULT_ENCODING
        xml = self.to_xml()
        if validate:
            if not dtd_str:
                dtd_str = utils.get_dtd_content(dtd_url,
                                                os.path.dirname(filename))
            utils.validate_xml(xml, dtd_str)

        doctype = '<!DOCTYPE %(root_tag)s SYSTEM "%(dtd_url)s">' % {
            'root_tag': self.tagname,
            'dtd_url': dtd_url}

        # Some etree versions are not valid according to StrictVersion so we
        # split it.
        etree_version = '.'.join(etree.__version__.split('.')[:2])
        if StrictVersion(etree_version) < StrictVersion('2.3'):
            xml_str = etree.tostring(
                xml.getroottree(),
                pretty_print=True,
                xml_declaration=True,
                encoding=encoding,
            )
            xml_str = xml_str.replace('<%s' % self.tagname,
                                      '%s\n<%s' % (doctype, self.tagname))
        else:
            xml_str = etree.tostring(
                xml.getroottree(),
                pretty_print=True,
                xml_declaration=True,
                encoding=encoding,
                doctype=doctype)
        if transform:
            xml_str = transform(xml_str)
        open(filename, 'w').write(xml_str)
コード例 #9
0
ファイル: elements.py プロジェクト: samjy/xmltool
    def write(self, filename=None, encoding=None, dtd_url=None, validate=True, transform=None):
        filename = filename or self._xml_filename
        if not filename:
            raise Exception("No filename given")
        dtd_url = dtd_url or self._xml_dtd_url
        if not dtd_url:
            raise Exception("No dtd url given")
        encoding = encoding or self._xml_encoding or DEFAULT_ENCODING
        xml = self.to_xml()
        if validate:
            dtd_str = utils.get_dtd_content(dtd_url, os.path.dirname(filename))
            utils.validate_xml(xml, dtd_str)

        doctype = '<!DOCTYPE %(root_tag)s SYSTEM "%(dtd_url)s">' % {"root_tag": self._tagname, "dtd_url": dtd_url}
        xml_str = etree.tostring(
            xml.getroottree(), pretty_print=True, xml_declaration=True, encoding=encoding, doctype=doctype
        )
        if transform:
            xml_str = transform(xml_str)
        open(filename, "w").write(xml_str)