本人没有用过python 今天遇到了一个问题。如图所示,传入一个路径之后,通过此方法转换后全部变成了\n 不太清楚其原理
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 文件示例和出错的代码行数。如果您还有其他问题,请随时向我提问。
【相关推荐】