如何按位置选择标记的所有子元素?

时间:2018-04-23 14:37:05

标签: python xml xpath

我有一个xml文件,看起来像这样:

<?xml version= "1.0" encoding="ISO-8859-1"?>
<File>
    <Field>
        <Name>CTX_LOG_SYS</Name>
        <ClearName></ClearName>
        <RawValue>000000000000000000000000</RawValue>
        <Array>
            <Name>TX</Name>
            <Row number="0">
                <Value>0</Value>
            </Row>
            <Row number="1">
                <Value>0</Value>
            </Row>
            <Row number="2">
                <Value>0</Value>
            </Row>
        </Array>
    </Field>
    <Field>
        <Name>VICK</Name>
        <ClearName></ClearName>
        <RawValue>0000016B00040</RawValue>
        <Array>
        <Name>VC</Name>
            <Row number="0">
                <Value>33</Value>
            </Row>
            <Row number="1">
                <Value>244</Value>
            </Row>
            <Row number="2">
                <Value>0</Value>
            </Row>
            <Row number="3">
                <Value>363</Value>
            </Row>
            <Row number="4">
                <Value>44</Value>
            </Row>
            <Row number="5">
                <Value>0</Value>
            </Row>
            <Row number="6">
                <Value>3</Value>
            </Row>
            <Row number="7">
                <Value>26</Value>
            </Row>
            <Row number="8">
                <Value>0</Value>
            </Row>
        </Array>
    </Field>    
</File> 

我想提取第二个数组的33, 244, 0, 363, 44, 0, 3, 26, 0的所有值。

我可以选择Value标签的所有内容,但我不能只按位置选择第2个值。

这是我的代码:

for vick in root.findall('./Field/Array[1]//'):
    val = vick.find('Value')
    if val is not None:
        print val.tag, val.attrib, val.text

我得到了这个结果:

Value {} 0
Value {} 0
Value {} 0
Value {} 33
Value {} 244
Value {} 0
Value {} 363
Value {} 44
Value {} 0
Value {} 3
Value {} 26
Value {} 0

有人可以帮忙吗? 谢谢!

我正在处理一个文件,其中这些标签重复Ntime,如下所示:

<?xml version= "1.0" encoding="ISO-8859-1"?>
<File>
    <Param>
        <Field>
            <Name>thydr</Name>
            <ClearName></ClearName>
            <RawValue>000000000000000000000000</RawValue>
            <Array>
            </Array>
        </Field>
        <Field>
            <Name>VICK</Name>
            <ClearName></ClearName>
            <RawValue>000001040</RawValue>
            <Array>
            </Array>
        </Field>
    </Param>
    <Param>
        <Field>
            <Name>thrss</Name>
            <ClearName></ClearName>
            <RawValue>000000000000000000000000</RawValue>
            <Array>
            </Array>
        </Field>
        <Field>
            <Name>VICK</Name>
            <ClearName></ClearName>
            <RawValue>0000016B00040</RawValue>
            <Array>
            </Array>
        </Field>
    </Param>
    <Param>
        <Field>
            <Name>ghytd</Name>
            <ClearName></ClearName>
            <RawValue>000000000000000000000000</RawValue>
            <Array>
            </Array>
        </Field>
        <Field>
            <Name>VICK</Name>
            <ClearName></ClearName>
            <RawValue>000000040</RawValue>
            <Array>
            </Array>
        </Field>
    </Param>
</File> 

对于每个<Param>代码,我想取第二个<Array>的值。

1 个答案:

答案 0 :(得分:1)

试试这个XPath:

/File/Field[2]/Array//Row/Value/text()

选择第二个数组的所有值。或者省略末尾的/text()以仅获取Value个节点 输出是:

3324403634403260

根据需要使用分隔符。