Python 搜索文本并替换为lxml

Python 搜索文本并替换为lxml,python,xml,lxml,Python,Xml,Lxml,我需要在有多个标记的多行XML文件中搜索文本。 我的XML文件如下所示 上下文1 xyz pqr s1 测试 pqr s1 测试 我想在XML文件中搜索文本“test”的外观,并在输出中列出它们的父标记。不幸的是,我不能这样做 我编写的Python代码是: import os import xml import sys from xml.dom import minidom import xml.etree.ElementTree as ET def xml_parsing():

我需要在有多个标记的多行XML文件中搜索文本。 我的XML文件如下所示


上下文1
xyz
pqr
s1
测试
pqr
s1
测试
我想在XML文件中搜索文本
“test”
的外观,并在输出中列出它们的父标记。不幸的是,我不能这样做

我编写的Python代码是:

import os
import xml 
import sys 
from xml.dom import minidom
import xml.etree.ElementTree as ET

def xml_parsing():
    ''' 
    with open('file.xml', 'rt') as f:
        tree = ET.parse(f)
        for node in tree.findall('.//context'):
            print node, node.tag, node.attrib
            url = node.attrib.get('tag1')
            print url 

xml_parsing()
我得到的输出结果是空白的,除此之外我什么也做不了。我尝试了
ElementTree
lxml
。我相信这与我试图使用
findall
查找的搜索模式有关

请用您的专家意见建议现在应该尝试什么

我也尝试了SAX方法,代码如下:

xmldoc = minidom.parse('file.xml')
reflist = xmldoc.getElementsByTagName('tag1')
print reflist[0].toxml()

但这会返回完整的行,而不仅仅是标记之间的值

无论XML文档中的元素名称和位置如何,文本值等于
test
的查找元素的XPath表达式是
/*[text()='test']
或者
/*[.='test']

考虑以下工作
lxml
示例,该示例演示如何查找此类元素并更新值:

from lxml import etree as ET

xml = '''<?xml version="1.0" encoding="utf-8"?>
<nc:data xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
    <system xmlns="http://www.abc.xyz">
      <context>
            <name>context_1</name>
            <host>
                <name>xyz</name>
                <tag1>
                    <name>pqr</name>
                    <role>s1</role>
                    <tag2>test</tag2>
                </tag1>
                <tag2>
                    <name>pqr</name>
                    <role>s1</role>
                    <tag2>test</tag2>
                </tag2>              
            </host>
      </context>
    </system>
</nc:data>'''

tree = ET.fromstring(xml)
for node in tree.xpath("//*[.='test']"):
    #update node value with new text 'foo'
    node.text = 'foo'
    print ET.tostring(node)
从lxml导入etree作为ET
xml=“”
上下文1
xyz
pqr
s1
测试
pqr
s1
测试
'''
tree=ET.fromstring(xml)
对于tree.xpath(“/*[.='test']”)中的节点:
#使用新文本“foo”更新节点值
node.text='foo'
打印ET.tostring(节点)
输出:

<tag2 xmlns="http://www.abc.xyz" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">foo</tag2>

<tag2 xmlns="http://www.abc.xyz" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">foo</tag2>
foo
福

感谢您的回复,但我的XML文件有点大,我希望通过将示例XML文件与python程序分离来保持代码干净。您能告诉我如何通过这种方法获得相同的结果吗?@AmitBhardwaj这只是为了演示,使代码易于复制粘贴运行。您可以使用
tree=ET.parse(f)
从像charm这样的文件工作加载XML树,从而保持自己的方法!!只是想知道是否有任何方法可以在输出中去掉xmlns和xmlnx:nc属性?我在这方面没有做太多的工作,但几小时前我读到有一个“namespace=False”方法,我们可以使用它来获得简化的输出。有一种方法可以从XML文档中清除未使用的命名空间声明