2016-03-10 2 views
0

В настоящее время я пытаюсь создать XML-файл из файла CSV. В настоящее время мой код читает файл CSV для данных и начинает создавать XML из данных, которые хранятся в CSV.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 генерирует следующий er ROR:

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

Известный причиной ошибки является то, что родитель paramenter возвращается в виде строки, когда она, как ожидается, будет элемент или подэлемент.

Можно ли вспомнить сохраненное значение из CSV и связать ли он элемент или подэлемент вместо строки? Цель состоит в том, чтобы позволить коду читать CSV-файл и назначать любой SubElement родительскому элементу, указанному в CSV.

+0

вы вообще спрашиваете, как вы смотрите на элементы по строкам. в общем, вам нужно будет создать свой собственный словарь для поиска и/или использовать xpath для его поиска (менее эффективное, но меньше памяти). поочередно, если вам просто нужен родительский элемент, если вы используете lxml, родительский элемент хранится в элементе (в отличие от реализации ElementTree по умолчанию). это имеет другие побочные эффекты (если вы делаете e = Element(), e2 = Element(); s = SubElement (e, 's'); e2.append (s) ', в ElementTree -' e' и 'e2 'теперь есть копия, в lxml она перемещается из' e' в 'e2' ...), но иногда это полезно ... –

ответ

0

Я не могу сказать наверняка, но похоже, что вы делаете: ElementTree.SubElement (ул, ул)

, когда вы должны делать: ElementTree.SubElement (Element, ул)

Похоже, вы уже это знаете. Итак, реальный вопрос заключается в том, как вы собираетесь ссылаться на родительский объект, когда знаете только его строку тега? Вы можете искать Elements в ElementTree с этой конкретной строкой тега, но это, как правило, не очень хорошая идея, поскольку XML допускает несколько экземпляров подобных элементов.

Я хотел бы предложить вам либо:

  • Найти стратегию для хранения ссылок на родительские элементы

  • Смотрите, если есть способ, чтобы однозначно определить родительский элемент с помощью XPath

Смежные вопросы