Python解析特定行的XML文件,并将行输出到文本小部件
我需要在windows msinfo文件(.nfo)中搜索某些行,并将它们打印到文本小部件中。我可以Python解析特定行的XML文件,并将行输出到文本小部件,python,xml,python-3.x,tkinter,Python,Xml,Python 3.x,Tkinter,我需要在windows msinfo文件(.nfo)中搜索某些行,并将它们打印到文本小部件中。我可以打印(行)文件中的任何一行,我可以将每一行输出到文本小部件,但只要我尝试指定要输出的行,它就会停止工作。我假设这是因为文件是XML,但我在python中看到的XML解析工具似乎在寻找像data=blah这样的行。当我在txt编辑器中打开它们时,我要查找的条目如下所示: <Category name="Disks"> <Data> <Item><![
打印(行)
文件中的任何一行,我可以将每一行输出到文本小部件,但只要我尝试指定要输出的行,它就会停止工作。我假设这是因为文件是XML,但我在python中看到的XML解析工具似乎在寻找像data=blah这样的行。当我在txt编辑器中打开它们时,我要查找的条目如下所示:
<Category name="Disks">
<Data>
<Item><![CDATA[Description]]></Item>
<Value><![CDATA[Disk drive]]></Value>
</Data>
<Data>
<Item><![CDATA[Manufacturer]]></Item>
<Value><![CDATA[(Standard disk drives)]]></Value>
</Data>
<Data>
<Item><![CDATA[Model]]></Item>
<Value><![CDATA[TOSHIB MK1652GSX SCSI Disk Device]]></Value>
</Data>
<Data>
<Item><![CDATA[Bytes/Sector]]></Item>
<Value><![CDATA[512]]></Value>
</Data>
<Data>
<Item><![CDATA[Media Loaded]]></Item>
<Value><![CDATA[Yes]]></Value>
</Data>
<Data>
<Item><![CDATA[Media Type]]></Item>
<Value><![CDATA[Fixed hard disk]]></Value>
</Data>
<Data>
<Item><![CDATA[Partitions]]></Item>
<Value><![CDATA[2]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Bus]]></Item>
<Value><![CDATA[1]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Logical Unit]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Port]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Target ID]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[Sectors/Track]]></Item>
<Value><![CDATA[63]]></Value>
</Data>
<Data>
<Item><![CDATA[Size]]></Item>
<Value><![CDATA[149.05 GB (160,039,272,960 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Cylinders]]></Item>
<Value><![CDATA[19,457]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Sectors]]></Item>
<Value><![CDATA[312,576,705]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Tracks]]></Item>
<Value><![CDATA[4,961,535]]></Value>
</Data>
<Data>
<Item><![CDATA[Tracks/Cylinder]]></Item>
<Value><![CDATA[255]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition]]></Item>
<Value><![CDATA[Disk #1, Partition #0]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Size]]></Item>
<Value><![CDATA[117.19 GB (125,830,301,184 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Starting Offset]]></Item>
<Value><![CDATA[32,256 bytes]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition]]></Item>
<Value><![CDATA[Disk #1, Partition #1]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Size]]></Item>
<Value><![CDATA[31.85 GB (34,200,714,240 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Starting Offset]]></Item>
<Value><![CDATA[125,830,333,440 bytes]]></Value>
</Data>
<Data>
使用上述方法时,我得到以下结果:
“C:\Program Files(x86)\Python35-32\python.exe”“D:/MY
STUFF/Programming/Python/testing.py“回溯(最近的调用
最后):文件“D:/MY STUFF/Programming/Python/testing.py”,第3行,在
tree=ET.parse(文件)AttributeError:模块“xml.etree”没有属性“parse”
进程已完成,退出代码为1
这是我的代码片段:
try:
u = find("msinfo.nfo", s)
for i in u:
cpfotxt.insert('end', i + "\n")
cpfotxt.yview(END)
cpfotxt.insert('end', "================================= \n")
with open(i, "r") as f:
r = f.readlines()
for line in r:
if "Model" in line:
cpfotxt.insert('end', line + "\n")
如果我删除第行中的If“Model”,那么它会将所有内容转储到文本小部件中
这是它们在windows上正常打开时的外观:
关于如何从nfo/XML文件中提取所需的行,有什么建议吗
此外,当从xml打印行时,字体会更大,并且间距会加倍。如何使行以与普通txt文件相同的方式打印 因此,您需要了解XML的结构,然后使用您正在寻找的实际标记,而不是“数据”
item = element.find('Item')
print(item.tag ,":",item.text)
value = element.find('Value')
print(value.tag ,":",value.text)
您实际的问题是需要更改所使用的导入
import xml.etree.ElementTree as ET
编辑:按照这种结构,您可以通过以下方式获得数据元素列表
for data in root.findall('Data'):
item = data.find('Item')
print(item.tag ,":",item.text)
value = data.find('Value')
print(value.tag ,":",value.text)
现在,请理解,如果“Data”标记不在根级别,那么您需要root.find(),直到找到它为止。换句话说,如果这些“数据”标记包含在一些父标记中,那么您需要root.find(“父标记”),希望您了解它的要点
Edit2:查看了我自己的msinfo.nfo文件,结果成功了:
disks = root.find(".//Category[@name='Disks']")
for disk in disks:
item = disk.find('Item')
print(item.tag ,":",item.text)
value = disk.find('Value')
print(value.tag ,":",value.text)
注意:这使用XPath语法查找元素,该元素仅在ElementTree1.3(Python 2.7及更高版本)中可用。您还可以通过遵循XML的结构并遍历树直到到达磁盘来强制执行它。路径是System Summary->Components->Storage->Disks,磁盘下是那些具有子项和值的数据元素。这是我的代码和您的示例数据,我知道可以编写得更好,但我认为这解决了您的问题:)
您必须找到根(xml),然后迭代它的文本!您还可以使用其他方法,如iterfind
,以获得更好的解决方案
xml_file = "<xml><Item><![CDATA[Model]]></Item><Value><![CDATA[TOSHIB MK1652GSX SCSI Disk Device]]></Value></xml>"
from xml.etree import ElementTree
root = ElementTree.fromstring(xml_file)
start = root.itertext()
while True:
try:
print start.next()
except StopIteration:
break
您应该能够使用ElementTree。。。你能详细说明一下你在试图用ET.parse解析它时使用的代码吗?@d_rez90我在原始的postcheck我的更新答案中添加了这个例子你得到的错误是因为你导入了错误的东西。您需要将xml.etree.ElementTree导入为ET@d_rez90呜呜声。好的,导入是固定的,不再有解析错误。现在我需要弄清楚如何将解析器指向磁盘类别,以便获得正确的项和值。直到10分钟前我才看到您的Edit2。我能够使用它找到我需要的一切,并输出到我的文本小部件。谢谢你花额外的时间来帮助我理解它是如何工作的。
xml_file = "<xml><Item><![CDATA[Model]]></Item><Value><![CDATA[TOSHIB MK1652GSX SCSI Disk Device]]></Value></xml>"
from xml.etree import ElementTree
root = ElementTree.fromstring(xml_file)
start = root.itertext()
while True:
try:
print start.next()
except StopIteration:
break
>>>Model
>>>TOSHIB MK1652GSX SCSI Disk Device