Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并输出循环lxml_Python_Python 3.x_Lxml - Fatal编程技术网

Python 合并输出循环lxml

Python 合并输出循环lxml,python,python-3.x,lxml,Python,Python 3.x,Lxml,我想从xml中提取一些元素,从变量中查找 以下是my.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] +

我想从xml中提取一些元素,从变量中查找

以下是my.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>

我认为您可以简单地检查item节点值并删除列表中不存在的节点。以下是实施方案:

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")
<?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>
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")