Python 搜索文本并替换为lxml
我需要在有多个标记的多行XML文件中搜索文本。 我的XML文件如下所示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():
上下文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文档中清除未使用的命名空间声明