Skip to main content
 首页 » 编程设计

python之使用 REGEX 通过脚本检查 XML 节点

2025年05月04日14powertoolsteam

这里有点问题,基本上我有一个我使用 GET 的网址。 例如返回 XML 文件的 111.244.25.633/Data.XML(不用担心 IP,它只是为设备组成的)。

在 Data.XML 中,我们有一些节点和子节点。 (我想像一棵树) 例如,整个数据是这样封装的:(缩进意味着它是上面的子节点......等等)

 <Data> 
   <DeviceData> 
       <Info> 
        <SerialNumber>154236</SerialNumber> 
        <Ethernet>Y</Ethernet> 
        <Wireless>N</Wireless> 
        <Mac>00:25:F6:25:K9</Mac> 
       </Info> 
   </DeviceData> 
 </Data> 

基本上,我想使用正则表达式来检查子节点(就像我想确保序列号是一个 6 位数字,而不是其他数字)

子节点将始终被称为相同的东西(如序列号、设备数据、数据......等)

什么是最容易使用的好扩展/语言?我了解基本的 python 和 bash,我非常了解 C/C++...但这对我来说更像是一个脚本任务。

有什么想法吗?

编辑:我忘了补充:我可能有更多或更少的 XML 标签(比如某些设备有更多设置等)所以我会在脚本中挑选特定的标签,而不是查看每个标签... .因为有些人可能比其他人拥有更多或更少。

请您参考如下方法:

请查看此回复:Regular Expressions to parse template tags in XML

您项目的演示...

from xml.etree import ElementTree 
import re 
 
def proper_SN(elem): 
    if re.search('\d{6}', elem.text): 
        return True 
    return False 
 
tree = ElementTree.parse('data.xml') 
rows = tree.getiterator('SerialNumber') 
for row in rows: 
    print "SerialNumber: %s Passed = %s" % (row.text, proper_SN(row)) 

运行这个...

[mpenning@hotcoffee tmp]$ python parse.py  
SerialNumber: 154236 Passed = True 
[mpenning@hotcoffee tmp]$ 

编辑

我不确定 XML 会如何变化...假设您更改了 DeviceData 元素...

 <Data> 
   <DeviceData> 
       <Info> 
        <SerialNumber>154236</SerialNumber> 
        <EngineVersion>12.0.4.13</EngineVersion> 
        <MediaType>100BaseT</MediaType> 
        <Ethernet>Y</Ethernet> 
        <Wireless>N</Wireless> 
        <Mac>00:25:F6:25:K9</Mac> 
       </Info> 
   </DeviceData> 
 </Data> 

使用简化的脚本...

from xml.etree import ElementTree 
import re 
 
def proper_SN(elem): 
    if re.search('\d{6}', elem.text): 
        return True 
    return False 
 
tree = ElementTree.parse('data.xml') 
serial = tree.find('DeviceData/Info/SerialNumber').text 
engine = tree.find('DeviceData/Info/EngineVersion').text 
media = tree.find('DeviceData/Info/MediaType').text 
 
if proper_SN: 
    serstr = "good" 
else: 
    serstr = "bad" 
 
print "Found a %s serial number (%s), with engine %s and media %s" % (serstr, serial, engine, media) 

我明白了

[mpenning@hotcoffee tmp]$ python parse.py  
Found a good serial number (154236), with engine 12.0.4.13 and media 100BaseT 
[mpenning@hotcoffee tmp]$