2014-01-09 3 views
0

У меня есть XML-файл, который нужно разобрать. Я сделал это с помощью мини-парсера python. Мне пришлось добавить атрибут к определенному элементу, который я сделал после разбора. Теперь я хочу записать файл обратно. Я не могу этого сделать.numpy.int64 'объект не имеет атрибута' replace 'во время записи xml-файла с помощью minidom

Ниже приведена ошибка, которую я получаю для этого. Я установил сегодня версию numpy 1.8 (win 32 python 2.7). Тем не менее, я никогда не пробовал писать xml-файл раньше. Не могли бы вы помочь?

Вот фрагмент кода:

xmlfile=open(xmlFile,'r') 
xmldoc = minidom.parse(xmlFile) 
tElements = xmldoc.getElementsByTagName("TEA") 
for t in tElements: 
    if(t.childNodes): 
     print t.nodeType 
     dataList = t.childNodes[0].data 
     for data, csvData in product(dataList, clusterDataList): 
      if(data == csvData[1]): 
       t.setAttribute("cluster",csvData[0]) 
xmlfile.close() 
fileWriter=open("sujatha_new.xml",'w') 

xmldoc.writexml(fileWriter) 
fileWriter.close() 

Вот исключение:

не
Traceback (most recent call last): 
    File "C:\Users\w44ylqrl\workspace\Python\Test\T\XMLConverter.py", line 215, in <module> 
    addClusterInfo('..\\T\\preprocessed_For_Clustering\\outputs\\sujatha-new.csv', '..\\T\\xml\\sujatha.xml') 
    File "C:\Users\w44ylqrl\workspace\Python\Test\T\XMLConverter.py", line 48, in addClusterInfo 
    xmldoc.writexml(fileWriter) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 1752, in writexml 
    node.writexml(writer, indent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 817, in writexml 
    node.writexml(writer, indent+addindent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 817, in writexml 
    node.writexml(writer, indent+addindent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 817, in writexml 
    node.writexml(writer, indent+addindent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 817, in writexml 
    node.writexml(writer, indent+addindent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 817, in writexml 
    node.writexml(writer, indent+addindent, addindent, newl) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 807, in writexml 
    _write_data(writer, attrs[a_name].value) 
    File "C:\Python27\Lib\xml\dom\minidom.py", line 296, in _write_data 
    data = data.replace("&", "&amp;").replace("<", "&lt;"). \ 
AttributeError: 'numpy.int64' object has no attribute 'replace' 
+0

Пожалуйста, предоставьте код, предупреждающий об ошибке. – alko

+0

Здравствуйте, alko, добавьте код, который вызывает это. Не могли бы вы взглянуть? – user1930402

+1

попробуйте добавить строку, преобразуя ваши данные в строки, прежде чем добавить их в DOM. – catchmeifyoutry

ответ

0

Ни один из питона реализаций XML позволяют сериализовать без представления строки, хотя некоторые из них позволит назначить их, если вы хотите злоупотреблять etree и т. д. как древовидная структура данных. Некоторые (например, lxml) даже не позволяют вам назначать их. Просто введите строку:

t.setAttribute("cluster",str(csvData[0])) 

и он будет работать. Если вы их десериализируете, вам нужно будет преобразовать значения обратно в int после загрузки.

+0

Спасибо, тонна !!!! :) – user1930402

+0

еще одна вещь, которую я только что поймал ... Я не уверен, что именно 't.childnodes [0] .data' есть, но это также строка, вряд ли будет то, что вы ожидали; по крайней мере, выполнение 'for x in data' будет итерации по символам в строке, а не значениям; вам может потребоваться сделать 'data.split (',')', чтобы сделать его списком, чтобы это действительно работало, как ожидалось. –