迷失在XML和Python中

2024-10-06 13:36:45 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我已经开始学习python了,我想用它来处理XML文件。

我一直在寻找最佳路线的信息,但坦率地说,我有点迷路了。处理XML文件的方法有很多种,比如ElementTree、lxml、minidom等等。有人能给我指出正确的方向吗。或者告诉我一些代码我可以绕着头。我已经开始尝试使用lxml,但还没有进一步打印所有元素。

以下是我要做的:

  1. 从csv文件中读取一行。加载标签和完整路径。在
  2. 在XML文件中查找匹配完整路径的项
  3. 将该项的标志1更改为TRUE
  4. 将该项的FLAG2和FLAG3更改为FALSE
  5. 将该项目的标签更改为CSV文件中的标签。在
  6. 写出新建.xml在

下面是我的xml结构。下面的两个记录在文件中重复了10000次。

<ThisIsMyData>
  <ITEM>
    <Number>0</Number>
    <Flag1>TRUE</Flag1>
    <Flag2>FALSE</Flag2>  
    <Flag3>FALSE</Flag3>
    <Label>RED</Label> <<-2- After finding 1 I need to change THIS(only this)
    <Path>C:\\test\\</Path> <-1- I need to find this 
    <file>test.png</file>
  </ITEM>
  <ITEM>
    <Number>1</Number>
    <Flag1>TRUE</Flag1>
    <Flag2>FALSE</Flag2>
    <Flag3>FALSE</Flag3>
    <Label>Blue</Label>
    <Path>c:\\test\\test2\\</Path>
    <file>blue.png</file>
  </ITEM>
 </ThisIsMyData>

所以我有一个根: 那么很多元素:。 每一个都有7个子元素。

这是我的CSV文件的样子,我需要我的输出看起来像: CSV文件:

^{pr2}$

如果布局混乱,请使用Pastebin链接:

http://pastebin.com/embed_js.php?i=QEx2ZGuY

我现在使用这个例子来尝试ElementTree: http://pymotw.com/2/xml/etree/ElementTree/parse.html。我设法在xml中搜索某个元素名并打印其内容。但我仍然看不到在同一级别上找到匹配元素的方法。

from xml.etree import ElementTree
with open('mydata.xml', 'rt') as f:
    tree = ElementTree.parse(f)
#    filelist = ElementTree.ElementTree.find()
for node in tree.findall('.//file'):
    FileName = node.tag, node.text
    print FileName      

输出:

('file', 'test.png')
('file', 'blue.png')

Tags: 文件pathtestfalse元素numberpngxml
3条回答

首先使用python csv模块从csv文件中获取数据。如果数据不是很大,字符串分割就可以正常工作。在

而不是使用etree.XML创建xml。在

示例:

>>>from lxml import etree
>>> csv_value = 'C:\\test\\'
>>> st = '<document>'+'<Flag1>FALSE</Flag1>' + '<Flag2>FALSE</Flag2>'+'<Path>' + csv_value + '</Path>' + '</document>'
>>> tree = etree.XML(st)
>>> etree.tostring(tree)
'<document><Flag1>FALSE</Flag1><Flag2>FALSE</Flag2><Path>C:\\test\\</Path></document>'

提取csv_value留给您作为练习。在

还有take a look at this question。在

下面是一个简单的例子,说明如何使用lxml.etreexpath来完成我认为您想要的操作。在

from cStringIO import StringIO
from lxml import etree

xmlfile = StringIO("""
<ThisIsMyData>
  <ITEM>
    <Number>0</Number>
    <Flag1>TRUE</Flag1>
    <Flag2>FALSE</Flag2>  
    <Flag3>FALSE</Flag3>
    <Label>RED</Label>
    <Path>C:\\test\\</Path>
    <file>test.png</file>
  </ITEM>
  <ITEM>
    <Number>1</Number>
    <Flag1>TRUE</Flag1>
    <Flag2>FALSE</Flag2>
    <Flag3>FALSE</Flag3>
    <Label>Blue</Label>
    <Path>c:\\test\\test2\\</Path>
    <file>blue.png</file>
  </ITEM>
 </ThisIsMyData>
""".strip())

datafile = StringIO("""
Label;FullPath
YELLOW;C:\\test\\test.png
YELLOW;c:\\test\\test2\\blue.png
""".strip())

# Read "csv". Simple, no error checking, skip first line.
filenameToLabel = {}
for l,f in (x.strip().split(';') for x in datafile.readlines()[1:]):
  filenameToLabel[f] = l

def first(seq,default=None):
  """xpath helper function"""
  for item in seq:
    return item
  return None

doc = etree.XML(xmlfile.read())

for item in doc.xpath('//ITEM'):
  item_filename = first(item.xpath('./Path/text()'),'').strip() + first(item.xpath('./file/text()'),'').strip()
  label = filenameToLabel.get(item_filename)
  if label is not None:
    first(item.xpath('./Flag1')).text = 'TRUE'
    first(item.xpath('./Flag2')).text = 'FALSE'
    first(item.xpath('./Flag3')).text = 'FALSE'
    first(item.xpath('./Label')).text = label

print etree.tostring(doc)

收益率

^{pr2}$

我发现BeautifulSoup和它的姐妹,Beautiful Stone Soup,有非常好的、简洁的、基于示例的文档,有助于深入研究和尝试真实世界的示例。在

但是,我也听说,ElementTree被一些人认为是python中的黄金标准。在

相关问题 更多 >