【问题标题】:xml parsing with extra '\n' and whitespaces using lxml library使用 lxml 库使用额外的 \'\\n\' 和空格解析 xml
【发布时间】:2022-12-19 19:34:04
【问题描述】:

我用 lxml 库编写了一个 python 程序来使用它的 xpath 解析一个 xml 文件。值和 xpath 都是正确的,但它返回许多 '\n' 和空格,就像 xml 文件的格式一样。

这是我的代码:

from lxml import etree
from xml.dom import minidom


#data = minidom.parse('D:/LocalSpark/bitmap.xml')
sigxml =  etree.parse('D:/LocalSpark/bitmap.xml',etree.XMLParser(remove_blank_text=True, load_dtd=True))
xpath = '/OneMessage[@Name="NR RRCReconfiguration"]/BalongMessage/Content/L3MessageContent/DL-DCCH-Message/message/c1/rrcReconfiguration/criticalExtensions/rrcReconfiguration/measConfig/measObjectToAddModList/MeasObjectToAddMod/measObject/measObjectNR/referenceSignalConfig/ssb-ConfigMobility/ssb-ToMeasure/setup/mediumBitmap'
info =  10000000    

for node in sigxml.xpath(xpath):
    print('node:     ', node)
    print('node.tag: ',node.tag)
    print('node.text:',node.text)
    print('node.item:',node.items())   
    print('node.attrib:',node.attrib)
    
    if info == node.text:
        print("%s info do exist!"%info)
    else:
        print("%s info do not exist!!!"%info)

这是 xml 文件:

<OneMessage Name="NR RRCReconfiguration" MsgTimeStamp="1668594368290"><BalongMessage><Header><usRsvd>4608</usRsvd><ucbMdmId>0</ucbMdmId><ucbMsgType>3</ucbMsgType><ucbRsvd>0</ucbRsvd><ulMsgClsID>26080000</ulMsgClsID><ullbTimeStamp>1853637.763054</ullbTimeStamp><ullbCpuTransID>38693</ullbCpuTransID><usSocpTransID>20388</usSocpTransID><ullLocalTime>133129368818699187</ullLocalTime><ulTransNo>6107</ulTransNo><ulSendPID>131072</ulSendPID><ulRecvPID>0</ulRecvPID><ulPrimID>00000003</ulPrimID><ucbOtaDirect>DL(1)</ucbOtaDirect><ucbPrintLevel>63</ucbPrintLevel><ulDataSize>56</ulDataSize></Header><Content><L3MessageContent><DL-DCCH-Message>
    <message>
        <c1>
            <rrcReconfiguration>
                <criticalExtensions>
                    <rrcReconfiguration>
                        <measConfig>
                            <measObjectToAddModList>
                                <MeasObjectToAddMod>
                                    <measObject>
                                        <measObjectNR>
                                            <referenceSignalConfig>
                                                <ssb-ConfigMobility>
                                                    <ssb-ToMeasure>
                                                        <setup>
                                                            <mediumBitmap>
                                                                10000000
                                                            </mediumBitmap>
                                                        </setup>
                                                    </ssb-ToMeasure>                                                   
                                                </ssb-ConfigMobility>
                                            </referenceSignalConfig>                                           
                                        </measObjectNR>
                                    </measObject>
                                </MeasObjectToAddMod>
                            </measObjectToAddModList>
                        </measConfig>
                    </rrcReconfiguration>
                </criticalExtensions>
            </rrcReconfiguration>
        </c1>
    </message>
</DL-DCCH-Message>
</L3MessageContent></Content></BalongMessage></OneMessage>

这是结果:

node:      <Element mediumBitmap at 0x22e3c645f80>
node.tag:  mediumBitmap
node.text:
                                                                10000000

node.item: []
node.attrib: {}
10000000 info do not exist!!!

我的问题是代码显然可以读取并找到 mediumBitmap 这个元素,但是正如它在 xml 文件中显示的那样,它前后都有 \n 。所以当程序继续时,它返回 mediumBitmap 的文本值是

\n 10000000 \n

但不只是10000000

它是项目中的标准 xml,因此我无法对其进行编辑。

我试图添加remove_blank_text=True来解析或使用minidom

都失败了

【问题讨论】:

    标签: python python-3.x xml-parsing lxml elementtree


    【解决方案1】:

    有很多方法可以去掉空格和换行符,但是,一种简单的技术是使用正则表达式来删除它们。

    关键线是这一行:

    int(re.sub(r'[\ns]*', '', node.text))
    

    哪些搜索和替代品node.text 中的所有回车符和空格,并将它们转换为 '' 无。然后转换为int,以便info变量相应匹配。

    这是代码:

    from lxml import etree
    from xml.dom import minidom
    import re
    
    
    #data = minidom.parse('D:/LocalSpark/bitmap.xml')
    sigxml =  etree.parse('D:/LocalSpark/bitmap.xml',etree.XMLParser(remove_blank_text=True, load_dtd=True))
    xpath = '/OneMessage[@Name="NR RRCReconfiguration"]/BalongMessage/Content/L3MessageContent/DL-DCCH-Message/message/c1/rrcReconfiguration/criticalExtensions/rrcReconfiguration/measConfig/measObjectToAddModList/MeasObjectToAddMod/measObject/measObjectNR/referenceSignalConfig/ssb-ConfigMobility/ssb-ToMeasure/setup/mediumBitmap'
    info =  10000000    
    
    for node in sigxml.xpath(xpath):
        print('node:     ', node)
        print('node.tag: ',node.tag)
        print('node.text:',node.text)
        print('node.item:',node.items())   
        print('node.attrib:',node.attrib)
        
        if info == int(re.sub(r'[\ns]*', '', node.text)):
            print("%s info do exist!"%info)
        else:
            print("%s info do not exist!!!"%info)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2016-04-25
      相关资源
      最近更新 更多