Объединить выходной цикл lxml - PullRequest
0 голосов
/ 04 мая 2018

Я хочу извлечь какой-то элемент из xml, который ищет переменную.

здесь my.xml файл:

<?xml version='1.0' encoding='UTF-8'?>
<ArrayOfSalesOrderHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SalesOrderHeader>
        <TenantCode>15152343</TenantCode>
        <SalesOrderDetails>
            <SalesOrderDetail>
                <ItemCode>20072129</ItemCode>
            </SalesOrderDetail>
            <SalesOrderDetail>
                <ItemCode>67332054</ItemCode>
            </SalesOrderDetail>
            <SalesOrderDetail>
                <ItemCode>20206133</ItemCode>
            </SalesOrderDetail>
            <SalesOrderDetail>
                <ItemCode>62071796</ItemCode>
            </SalesOrderDetail>
        </SalesOrderDetails>
    </SalesOrderHeader>
</ArrayOfSalesOrderHeader>

это мой сценарий:

doc = ET.parse("my.xml")
arrDat = '20206133'
fol = doc.xpath('.//SalesOrderDetail[descendant::ItemCode[not(contains(text(),"' + arrDat + '"))]]')
for SOD in fol :
    SOD.getparent().remove(SOD)

doc.write('output.xml', xml_declaration=True, encoding='utf-8', method="xml")

Проблема, когда я определил arrDat как массив:

doc = ET.parse("my.xml")
arrDat = ['20072129','67332054']
cnt = 0
while cnt < len(arrDat) :
    fol = doc.xpath('.//SalesOrderDetail[descendant::ItemCode[not(contains(text(),"' + arrDat[cnt] + '"))]]')
    for SOD in fol :
        SOD.getparent().remove(SOD)


    doc.write('output.xml', xml_declaration=True, encoding='utf-8', method="xml")
    cnt += 1

мне нужно, чтобы output.xml был похож на:

<?xml version='1.0' encoding='UTF-8'?>
<ArrayOfSalesOrderHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SalesOrderHeader>
        <TenantCode>15152343</TenantCode>
        <SalesOrderDetails>
            <SalesOrderDetail>
                <ItemCode>20072129</ItemCode>
            </SalesOrderDetail>
            <SalesOrderDetail>
                <ItemCode>67332054</ItemCode>
            </SalesOrderDetail>
        </SalesOrderDetails>
    </SalesOrderHeader>
</ArrayOfSalesOrderHeader>

1 Ответ

0 голосов
/ 04 мая 2018

Я думаю, что вы можете просто проверить значение узла элемента и удалить тот, которого нет в вашем списке. Вот реализация:

from lxml import etree as ET

doc = ET.parse("data1.xml")
arrDat = ['20072129', '67332054']

for order in doc.xpath("//SalesOrderDetail"):
    item = order.xpath('ItemCode')
    item_code = item[0].text
    if item_code not in arrDat:
        order.getparent().remove(order)

doc.write('output.xml', xml_declaration=True, encoding='utf-8', method="xml")
...