python 的 lxml 中的 xpath 只得到一个节点
xpath in lxml for python get just a single node
我有这份 xml 文件。我试图将此处显示为 1-7 的数据组放入数据类别。当使用 Xpath 时,我通常可以过滤到我需要的地方,但是当我访问 Con1 时,它似乎没有只给我那组 children,它给了我相同级别的所有东西 "dict"
<dict>
<key>Tester</key>
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con2</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:16:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:48:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con3</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
</dict>
所以如果我写:
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"][1]'
x = tree.xpath(myPath)
etree.tostring(x, pretty_print=True)
我会得到:
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con2</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:16:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:48:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con3</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
我希望只设置第一个连接,这样我就可以正确地向其中添加数据。所以当 运行 那组代码看起来像这样时,我的理想输出是:
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
我在这里做错了什么?
对于 Andersson 的回复,我将使用此代码编辑源代码。它确实有效,但由于上述问题,无法确定应该放置的正确级别。
for parent in tree.xpath(myPath)
parent.insert(1, data)
经过大量调试后,我发现如果我添加“/dict”调用,我可以分隔我的部分并使用 [#]
访问它们
所以不是这个:
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"][1]'
使用这个
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"]/dict[1]'
我有这份 xml 文件。我试图将此处显示为 1-7 的数据组放入数据类别。当使用 Xpath 时,我通常可以过滤到我需要的地方,但是当我访问 Con1 时,它似乎没有只给我那组 children,它给了我相同级别的所有东西 "dict"
<dict>
<key>Tester</key>
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con2</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:16:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:48:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con3</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
</dict>
所以如果我写:
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"][1]'
x = tree.xpath(myPath)
etree.tostring(x, pretty_print=True)
我会得到:
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con2</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:16:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>0:48:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
<key>Con3</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
我希望只设置第一个连接,这样我就可以正确地向其中添加数据。所以当 运行 那组代码看起来像这样时,我的理想输出是:
<dict>
<key>Con1</key>
<dict>
<key>KeySet</key>
<dict>
<key>B52:B53:B54</key>
<array>
<dict>
<key>0:0:0</key>
<dict>
<key>Data</key>
<array>
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
<string>5</string>
<string>6</string>
<string>7</string>
</array>
</dict>
</dict>
<dict>
<key>15:15:3</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:0</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
<dict>
<key>7:15:1</key>
<dict>
<key>Data</key>
<array/>
</dict>
</dict>
</array>
</dict>
</dict>
我在这里做错了什么?
对于 Andersson 的回复,我将使用此代码编辑源代码。它确实有效,但由于上述问题,无法确定应该放置的正确级别。
for parent in tree.xpath(myPath)
parent.insert(1, data)
经过大量调试后,我发现如果我添加“/dict”调用,我可以分隔我的部分并使用 [#]
访问它们所以不是这个:
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"][1]'
使用这个
myPath = '//dict[key/text()="Tester"]/dict[key/text()="Con1"]/dict[1]'