2016-03-10 94 views
0

我目前正在尝试从CSV文件构建XML文件。目前,我的代码将CSV文件读取到数据,并开始从存储在CSV中的数据创建XML。Python XML'TypeError:必须是xml.etree.ElementTree.Element,而不是str'

CSV示例:

Element,XMLFile 
SubElement,XMLName,XMLFile 
SubElement,XMLDate,XMLName 
SubElement,XMLInformation,XMLDate 
SubElement,XMLTime,XMLName 

预期输出:

<XMLFile> 
    <XMLName> 
     <XMLDate> 
      <XMLInformation /> 
     </XMLDate> 
     <XMLTime /> 
    </XMLName> 
</XMLFile> 

目前我的代码试图看看CSV看到父母是做什么用的新的子元素:

# Defines main element 
# xmlElement = xml.Element(XMLFile) 
xmlElement = xml.Element(csvData[rowNumber][columnNumber]) 

# Should Define desired parent (FAIL) and SubElement name (PASS) 
# xmlSubElement = xml.SubElement(XMLFile, XMLName) 
xmlSubElement = xml.SubElement(csvData[rowNumber][columnNumber + 2], csvData[rowNumber][columnNumber + 1]) 

当代码尝试使用CSV源字符串作为父参数时,Python 3.5将生成以下呃ROR:错误

TypeError: must be xml.etree.ElementTree.Element, not str 

已知的原因是父paramenter被作为字符串返回,当它被预期为Element或子元素。

是否可以从CSV中调用存储的值并让它引用Element或SubElement而不是字符串?目标是允许代码读取CSV文件并将任何子元素分配给CSV中列出的父元素。

+0

你一般会问你如何按字符串查找元素。一般来说,您需要为它创建自己的查找字典,和/或使用xpath来搜索它(效率较低,但内存较少)。或者,如果您只需要父项,如果您使用lxml,则父项将存储在元素中(与默认的ElementTree实现不同)。这有其他副作用(如果你在ElementTree中执行'e = Element(),e2 = Element(); s = SubElement(e,'s'); e2.append(s)''e'和'e2 '现在有一个副本,在lxml中它从'e'移动到'e2' ...),但它有时很有用...... –

回答

0

我不能告诉是肯定的,但它看起来像你正在做的: ElementTree.SubElement(STR,STR)

当你应该做的: ElementTree.SubElement(元素,STR)

这也似乎你已经知道这一点。那么真正的问题是,当你只知道它的标签字符串时,你将如何引用父对象?您可以使用特定的标记字符串搜索ElementTree中的元素,但这通常不是一个好主意,因为XML允许类似元素的多个实例。

我建议您:

  • 查找引用存储父元素的策略

  • 看看是否有一种方法可以使用XPath

唯一标识父元素
相关问题