我厌倦了XML和Python.任务很简单,但到目前为止我无法解决它并花了很长时间.我来这里是为了建议如何用几行来解决它.
感谢您遍历树的任何帮助.我总是得到太多或太少的元素.元素可以无限制地嵌套.举个例子就是一个例子.我会接受任何解决方案,而不是挑剔dom,minidom,sax,等等......
我有一个类似于这个的XML文件:
<root>
<elm>
<elm>Common content</elm>
<elm xmlns="http://example.org/ns">
<elm lang="en">Content EN</elm>
<elm lang="cs">žlu?ou?ký koní?ek</elm>
</elm>
<elm xml:id="abc123">Common content</elm>
<elm lang="en">Content EN</elm>
<elm lang="cs">Content CS</elm>
<elm lang="en">
<elm>Content EN</elm>
<elm>Content EN</elm>
</elm>
<elm lang="cs">
<elm>Content CS</elm>
<elm>Content CS</elm>
</elm>
</elm>
</root>
Run Code Online (Sandbox Code Playgroud)
我需要的 - 解析XML并编写一个新文件.新文件应包含给定语言的所有元素和没有lang属性的元素.
对于"cs"语言,输出文件应包含以下内容:
<root>
<elm>
<elm>Common content</elm>
<elm xmlns="http://example.org/ns">
<elm lang="cs">žlu?ou?ký koní?ek</elm>
</elm>
<elm xml:id="abc123">Common content</elm>
<elm lang="cs">Content CS</elm>
<elm lang="cs">
<elm>Content CS</elm>
<elm>Content CS</elm>
</elm>
</elm>
</root>
Run Code Online (Sandbox Code Playgroud)
如果你可以让它省略lang新文件中的属性,那就更好了.但它并不重要.
UPDATE1:添加了unicode字符和名称空间属性.
UPDATE2:使用Python 2.5,首选标准库.
unu*_*tbu 10
使用lxml:
import lxml.etree as le
with open('doc.xml','r') as f:
doc=le.parse(f)
for elem in doc.xpath('//*[attribute::lang]'):
if elem.attrib['lang']=='en':
elem.attrib.pop('lang')
else:
parent=elem.getparent()
parent.remove(elem)
print(le.tostring(doc))
Run Code Online (Sandbox Code Playgroud)
产量
<root>
<elm>Common content</elm>
<elm>
<elm>Content EN</elm>
</elm>
<elm>Common content</elm>
<elm>Content EN</elm>
<elm>
<elm>Content EN</elm>
<elm>Content EN</elm>
</elm>
</root>
Run Code Online (Sandbox Code Playgroud)
我不确定如何最好地删除lang属性,但是这里有一些代码可以执行其他更改(Python 2.7;对于2.5或2.6,getIterator而不是使用iter),假设当您删除元素时,您也总是希望删除包含的所有内容在那个元素.
此代码只是将结果打印到标准输出(您可以根据需要重定向它,当然,或直接将其写入某个新文件,依此类推):
import sys
from xml.etree import cElementTree as et
def picklang(path, lang='en'):
tr = et.parse(path)
for element in tr.iter():
for subelement in element:
la = subelement.get('lang')
if la is not None and la != lang:
element.remove(subelement)
return tr
if __name__ == '__main__':
tr = picklang('la.xml')
tr.write(sys.stdout)
print
Run Code Online (Sandbox Code Playgroud)
随着la.xml是你的榜样,这写
<root>
<elm>Common content</elm>
<elm>
<elm lang="en">Content EN</elm>
</elm>
<elm>Common content</elm>
<elm lang="en">Content EN</elm>
<elm lang="en">
<elm>Content EN</elm>
<elm>Content EN</elm>
</elm>
</root>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30188 次 |
| 最近记录: |