Найти - Пользователи
Полная версия: копирование элементов xml-структуры
Начало » Python для новичков » копирование элементов xml-структуры
1
kzoi_py
Всем доброго времени суток. Допустим у нас есть xml файл такого вида (лишнее удалил)
<w:wordDocument>
<w:body>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="РўР°Р+Р>РёС&#9532;Р°1"/>
<w:tblW w:w="9639.0002" w:type="dxa"/>
<w:tblInd w:w="0" w:type="auto"/>
<w:jc w:val="left"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4819.5001"/>
<w:gridCol w:w="4819.5001"/>
</w:tblGrid>
<w:tr>
<w:trPr/>
<w:tc>
<w:tcPr>
<w:tcW w:type="dxa" w:w="4819.5001"/>
<w:tcMar/>
<w:tcBorders>
<w:top w:val="single" w:sz="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="0" w:color="000000"/>
<w:left w:val="single" w:sz="0" w:color="000000"/>
<w:right w:val="none" w:sz="0" w:color="auto"/>
</w:tcBorders>
</w:tcPr>
<w:p>
<w:pPr>
<w:pStyle w:val="P1"/>
</w:pPr>
<w:r>
<w:t>6</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:type="dxa" w:w="4819.5001"/>
<w:tcMar/>
<w:tcBorders>
<w:top w:val="single" w:sz="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="0" w:color="000000"/>
<w:left w:val="single" w:sz="0" w:color="000000"/>
<w:right w:val="single" w:sz="0" w:color="000000"/>
</w:tcBorders>
</w:tcPr>
<w:p>
<w:pPr>
<w:pStyle w:val="P1"/>
</w:pPr>
<w:r>
<w:t>7</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:body>
</w:wordDocument>
Структура описывает таблицу и её свойства. В данном случае есть одна запись с двумя полями. Собственно вопрос. Есть ли в lxml возможность копировать теги и их потомки. Иными словами я копирую тек tc из пространства имён w и захватываю всю структуру записи (её форматирование и содержимое. Пробывал работать через xpath (а именно - получаем число таблиц, получаем число записей, добавляем из доступных записей к определённой таблице новую из имеющихся (вроде как дублируем одну из записей), опять получаем число записей - их количество не увеличилось на 1 и осталось прежним) но что-то не выходит “каменный цветок”. За ранее спасибо :)
pyuser
namespace Вы удалили, поэтому я указал произвольный (xmlns:w="http://www.w3.org/1999/xhtml")
тогда, дублирование узлов w:tc например, можно сделать так:
from copy import deepcopy
from lxml import etree

parser = etree.XMLParser(remove_blank_text=True, strip_cdata=False)
dom = etree.fromstring(..., parser)

namespaces={"w" : "http://www.w3.org/1999/xhtml"}
tr_node = dom.xpath(".//w:tr", namespaces=namespaces)[0]
for tc_node in dom.xpath(".//w:tc", namespaces=namespaces):
tr_node.append(deepcopy(tc_node))

with open("newdoc.xml", "wb") as f:
f.write(etree.tostring(dom, pretty_print=True))
kzoi_py
Благодарю за помощь :) поработаю
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB