从一个xml文件到另一个xml文件打印搜索索引



我编写了从XML文件查找索引我正在寻找的代码。我要找的索引都写在data.txt文件中。打开data.txt文件,我已经准备好代码with open("data.txt") as in_file:)…k=[int(number, 16) for number in data]。现在我只需要将所有索引(在data.txt中)打印到输出文件(output.xml)中。我想使用for循环,但我不知道在哪里。

DATA.TXT:

'3001','1018','1200'
代码:

from lxml import etree as ET
import serial as ser
tree = ET.parse('master.xml')
root = tree.getroot()

with open("data.txt") as in_file:
    data = in_file.read().strip().replace("'", "").split(",")
    k=[int(number, 16) for number in data]
for MagicNumber in root.findall('MagicNumber'):
    print MagicNumber.tag,':', MagicNumber.text
print''
for FileInfo in root.find('FileInfo'):
    print FileInfo.tag,':', FileInfo.text
print''
for DeviceInfo in root.find('DeviceInfo'):
    print DeviceInfo.tag,':', DeviceInfo.text
print''
for DummyUsage in root.find('DummyUsage'):
    print DummyUsage.tag,':', DummyUsage.text
print''
for ObjectDictionary in root.find('ObjectDictionary'):
    print ''
    print ObjectDictionary.tag,':', ObjectDictionary.get('name'), ObjectDictionary.text
    for Record in ObjectDictionary.iter('Record'):
        if Record.find('./Index').text == str(i):
            print 'Record name: ', Record.attrib['name']
        elif Record.find('./Index').text != str(i):
            ObjectDictionary.remove(Record)              
    def remove_self(target):
        target.getparent().remove(target)
    for Variable in ObjectDictionary.iter('Variable'): 
        if Variable.find('./Index').text == str(i):
            print 'Variable name: ', Variable.attrib['name']
        elif Variable.find('./Index').text != str(i):
            remove_self(Variable)
    for Array in ObjectDictionary.iter('Array'):
        if Array.find('./Index').text == str(i):
            print 'Array name: ', Array.attrib['name']
        elif Array.find('./Index').text != str(i):
            ObjectDictionary.remove(Array)
tree.write('output.xml')
XML:

<?xml version="1.0"?>
<EDSFile>
    <MagicNumber>-1616</MagicNumber>
    <FileInfo>
        <FileVersion>1</FileVersion>
        <FileRevision>0</FileRevision>
        <ModificationTime>12:19PM</ModificationTime>
    </FileInfo>
    <DeviceInfo>
        <ProductNumber>0</ProductNumber>
        <RevisionNumber>0</RevisionNumber>
        <OrderCode>Order code</OrderCode>
        <BaudRate_10>0</BaudRate_10>
        <BaudRate_20>0</BaudRate_20>
        <BaudRate_1000>0</BaudRate_1000>
        <Granularity>0</Granularity>
    </DeviceInfo>
    <DummyUsage>
        <Dummy0001>0</Dummy0001>
        <Dummy0002>1</Dummy0002>
        <Dummy0003>1</Dummy0003>
    </DummyUsage>
    <ObjectDictionary>
        <Group name="MandatoryObjects">
        </Group>
        <Group name="OptionalObjects">
            <Array name="Store Parameter Field">
                <Index>4112</Index>
                <ObjectType>8</ObjectType>
                <Variable name="Number of Entries">
                    <Index>4112</Index>
                    <Subindex>0</Subindex>
                    <DataType>5</DataType>
                    <AccessType>0</AccessType>
                    <ObjectType>7</ObjectType>
                    <DefaultValue>3</DefaultValue>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Save all Parameters">
                    <Index>4112</Index>
                    <Subindex>1</Subindex>
                    <DataType>7</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Save Communication Parameters">
                    <Index>4112</Index>
                    <Subindex>2</Subindex>
                    <DataType>7</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Save Application Parameters">
                    <Index>4112</Index>
                    <Subindex>3</Subindex>
                    <DataType>7</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <PDOMapping>0</PDOMapping>
                </Variable>
            </Array>
            <Variable name="COB-ID EMCY">
                <Index>4116</Index>
                <Subindex>0</Subindex>
                <DataType>7</DataType>
                <AccessType>0</AccessType>
                <ObjectType>7</ObjectType>
                <DefaultValue>$NODEID+0x80</DefaultValue>
                <PDOMapping>0</PDOMapping>
            </Variable>
            <Variable name="Inhibit Time Emergency">
                <Index>4117</Index>
                <Subindex>0</Subindex>
                <DataType>6</DataType>
                <AccessType>2</AccessType>
                <ObjectType>7</ObjectType>
                <DefaultValue>0x01F4</DefaultValue>
                <PDOMapping>0</PDOMapping>
            </Variable>
            <Variable name="Producer Heartbeat Time">
                <Index>4119</Index>
                <Subindex>0</Subindex>
                <DataType>6</DataType>
                <AccessType>2</AccessType>
                <ObjectType>7</ObjectType>
                <DefaultValue>0x000003E8</DefaultValue>
                <PDOMapping>0</PDOMapping>
            </Variable>
        </Group>
        <Group name="ManufacturerObjects">
            <Array name="Error_Log_Time_Hours_PRODUCER">
                <Index>8257</Index>
                <ObjectType>8</ObjectType>
                <Variable name="Time_Last_Error_(h)_4">
                    <Index>8257</Index>
                    <Subindex>5</Subindex>
                    <DataType>6</DataType>
                    <AccessType>0</AccessType>
                    <ObjectType>7</ObjectType>
                    <DefaultValue>0x00</DefaultValue>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Time_Last_Error_(h)_10">
                    <Index>8257</Index>
                    <Subindex>11</Subindex>
                    <DataType>6</DataType>
                    <AccessType>0</AccessType>
                    <ObjectType>7</ObjectType>
                    <DefaultValue>0x00</DefaultValue>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Time_Last_Error_(h)_20">
                    <Index>8257</Index>
                    <Subindex>21</Subindex>
                    <DataType>6</DataType>
                    <AccessType>0</AccessType>
                    <ObjectType>7</ObjectType>
                    <DefaultValue>0x00</DefaultValue>
                    <PDOMapping>0</PDOMapping>
                </Variable>
            </Array>
            <Variable name="Test_DOUT_Value">
                <Index>9229</Index>
                <Subindex>0</Subindex>
                <DataType>3</DataType>
                <AccessType>2</AccessType>
                <ObjectType>7</ObjectType>
                <DefaultValue>0</DefaultValue>
                <PDOMapping>0</PDOMapping>
            </Variable>
            <Variable name="PDO_RxLdtp2">
                <Index>9253</Index>
                <Subindex>0</Subindex>
                <DataType>3</DataType>
                <AccessType>1</AccessType>
                <ObjectType>7</ObjectType>
                <DefaultValue>0x00</DefaultValue>
                <PDOMapping>1</PDOMapping>
            </Variable>
        </Group>
        <Group name="ParametersObjects">
            <Array name="Test mode configuration">
                <Index>12319</Index>
                <ObjectType>8</ObjectType>
                <Variable name="Number of entries">
                    <Index>12319</Index>
                    <Subindex>0</Subindex>
                    <DataType>3</DataType>
                    <AccessType>0</AccessType>
                    <ObjectType>7</ObjectType>
                    <DefaultValue>9</DefaultValue>
                    <LowLimit>1</LowLimit>
                    <HighLimit>64</HighLimit>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Duty cycle change slope">
                    <Index>12319</Index>
                    <Subindex>7</Subindex>
                    <DataType>3</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <LowLimit>0</LowLimit>
                    <HighLimit>32767</HighLimit>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Stator frequency change slope">
                    <Index>12319</Index>
                    <Subindex>8</Subindex>
                    <DataType>3</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <LowLimit>0</LowLimit>
                    <HighLimit>32767</HighLimit>
                    <PDOMapping>0</PDOMapping>
                </Variable>
                <Variable name="Slip frequency change slope">
                    <Index>12319</Index>
                    <Subindex>9</Subindex>
                    <DataType>3</DataType>
                    <AccessType>2</AccessType>
                    <ObjectType>7</ObjectType>
                    <LowLimit>0</LowLimit>
                    <HighLimit>32767</HighLimit>
                    <PDOMapping>0</PDOMapping>
                </Variable>
            </Array>
        </Group>
    </ObjectDictionary>
</EDSFile>

问题:ObjectDictionary.iter('Variable')实际上迭代节点ObjectDictionary的整个树。在您的示例中,Variable的匹配更深4层(请参阅下面的xml转储)。

<Group name="OptionalObjects">
  <Array name="Store Parameter Field">
    <Index>4112</Index>
      <ObjectType>8</ObjectType>
        <Variable name="Number of Entries">
          <Index>4112</Index>
          <Subindex>0</Subindex>
          <DataType>5</DataType>
          <AccessType>0</AccessType>
          <ObjectType>7</ObjectType>
          <DefaultValue>3</DefaultValue>
          <PDOMapping>0</PDOMapping>
        </Variable>

解决方案:要删除这些元素,您应该调用Variable.getparent().remove(Variable) .

因为在代码中有很多地方需要从迭代结果中删除元素。我建议定义一个辅助函数并调用该函数来完成工作。

def remove_self(target):
    target.getparent().remove(target)
# YOUR CODE
for Variable in ObjectDictionary.iter('Variable'): 
    if Variable.find('./Index').text == str(i):
        print 'Variable name: ', Variable.attrib['name']
    elif Variable.find('./Index').text != str(i):                    
        remove_self(Variable)

最新更新