python 中xmlfile2obj代码转换成了\n

本人没有用过python 今天遇到了一个问题。如图所示,传入一个路径之后,通过此方法转换后全部变成了\n 不太清楚其原理

img


这是详细

    non_id_char = re.compile('[^_0-9a-zA-Z]')
    def _name_mangle(name):
        return non_id_char.sub('_', name)

    class DataNode(object):
        def __init__(self):
            self._attrs = {}    # XML attributes and child elements
            self.data = None    # child text data
        def __len__(self):
            # treat single element as a list of 1
            return 1
        def __getitem__(self, key):
            if isinstance(key, basestring):
                return self._attrs.get(key,None)
            else:
                return [self][key]
        def __contains__(self, name):
            return self._attrs.has_key(name)
        def __nonzero__(self):
            return bool(self._attrs or self.data)
        def __getattr__(self, name):
            if name.startswith('__'):
                # need to do this for Python special methods???
                raise AttributeError(name)
            return self._attrs.get(name,None)
        def _add_xml_attr(self, name, value):
            if name in self._attrs:
                # multiple attribute of the same name are represented by a list
                children = self._attrs[name]
                if not isinstance(children, list):
                    children = [children]
                    self._attrs[name] = children
                children.append(value)
            else:
                self._attrs[name] = value
        def __str__(self):
            return self.data or ''
        def __repr__(self):
            items = sorted(self._attrs.items())
            if self.data:
                items.append(('data', self.data))
            return u'{%s}' % ', '.join([u'%s:%s' % (k,repr(v)) for k,v in items])

    class TreeBuilder(xml.sax.handler.ContentHandler):
        def __init__(self):
            self.stack = []
            self.root = DataNode()
            self.current = self.root
            self.text_parts = []
        def startElement(self, name, attrs):
            self.stack.append((self.current, self.text_parts))
            self.current = DataNode()
            self.text_parts = []
            # xml attributes --> python attributes
            for k, v in attrs.items():
                self.current._add_xml_attr(_name_mangle(k), v)
        def endElement(self, name):
            #text = ''.join(self.text_parts).strip()
            text = ''.join(self.text_parts)
            if text:
                self.current.data = text
            if self.current._attrs:
                obj = self.current
            else:
                # a text only node is simply represented by the string
                obj = text or ''
            self.current, self.text_parts = self.stack.pop()
            self.current._add_xml_attr(_name_mangle(name), obj)
        def characters(self, content):
            self.text_parts.append(content)

    builder = TreeBuilder()
    if isinstance(src,basestring):
        xml.sax.parseString(src, builder)
    else:
        xml.sax.parse(src, builder)
    return builder.root._attrs.values()[0]

def xmlfile2obj( filepath ):
    h = open(filepath)
    xml = h.read().decode( 'UTF-8' )
    h.close()
    return xml2obj(xml)

有空格的原因

【以下回答由 GPT 生成】

这段代码中将XML文件转换为对象的过程并没有出现将所有内容转换成"\n"的情况。在给出的代码中,函数 _add_xml_attr 用于将XML文件中的属性和子元素添加到对象的 _attrs 字典中。

如果您遇到将所有内容转换成"\n"的情况,请确保在调用 _add_xml_attr 函数时,正确地提供了属性名称和属性值。另外,您可能需要检查您的XML文件是否符合XML的格式要求。

以下是一个使用给出的代码将XML文件转换为对象的示例:

import xml.etree.ElementTree as ET

def parse_xml_file(filepath):
    tree = ET.parse(filepath)
    root = tree.getroot()

    obj = DataNode()

    def traverse(node, parent):
        if node.text and node.text.strip():
            parent.data = node.text.strip()

        for child in node:
            child_obj = DataNode()
            parent._add_xml_attr(_name_mangle(child.tag), child_obj)
            traverse(child, child_obj)

            for key, value in child.attrib.items():
                child_obj._add_xml_attr(_name_mangle(key), value)

    traverse(root, obj)

    return obj

您可以使用 parse_xml_file 函数将给定路径下的XML文件转换为对象。请确保在调用 parse_xml_file 函数之前,已经正确地定义了 DataNode 类和 _name_mangle 函数。

请注意,为了更好地帮助解决您的问题,建议您提供具体的 XML 文件示例和出错的代码行数。如果您还有其他问题,请随时向我提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^