ホーム>source

ET.findall( '*/ROW')メソッド(ETとしてのxml.etree.ElementTree)によってSOAP xmlからすべてのROW要素のリストを取得しようとしましたが、結果はありません。 xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><SOAP-CHK:Success xmlns:SOAP-CHK = "http://soaptest1/soaptest/" xmlns="urn:candle-soap:attributes"><TABLE name="O4SRV.TSITSTSH">
<OBJECT>Status_History</OBJECT>
<DATA>
    <ROW>
        <Global_Timestamp>tttt01</Global_Timestamp>
        <Situation_Name>nnn01</Situation_Name>
        <Status>Raised</Status>
        <Atomize></Atomize>
    </ROW>
    <ROW>
        <Global_Timestamp>tttt02</Global_Timestamp>
        <Situation_Name>nnn02</Situation_Name>
        <Status>Reset</Status>
        <Atomize></Atomize>
    </ROW>
    <ROW>
        <Global_Timestamp>tttt03</Global_Timestamp>
        <Situation_Name>nnn03</Situation_Name>
        <Status>Raised</Status>
        <Atomize></Atomize>
    </ROW>
</DATA>
</TABLE>
</SOAP-CHK:Success></SOAP-ENV:Body></SOAP-ENV:Envelope>

このxmlからすべてのSOAPタグを削除すると、すべてが正常になり、行のリストが取得されます。 SOAPタグを削除せずにROW要素のリストを取得するには、findallメソッドで文字列を変更する必要がありますか?

またやってみる

'*/SOAP-ENV:Envelope[@SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"]/SOAP-ENV:Body/SOAP-CHK:Success[@xmlns="urn:candle-soap:attributes"]/TABLE[@name="O4SRV.TSITSTSH"]/DATA//ROW'

およびその他の組み合わせ、ただし結果なしでエラーが発生する:

SyntaxError: prefix 'SOAP-ENV' not found in prefix map

または

SyntaxError: prefix 'SOAP-ENV' not found in prefix map

あなたの答え
  • 解決した方法 # 1

    基本的に、すべての <ROW> の下にあるすべてのタグのテキスト値を抽出しました  タグ。

    それはあなたが探しているものですか?

    コード:

    from bs4 import BeautifulSoup
    xml = '''
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><SOAP-CHK:Success xmlns:SOAP-CHK = "http://soaptest1/soaptest/" xmlns="urn:candle-soap:attributes"><TABLE name="O4SRV.TSITSTSH">
    <OBJECT>Status_History</OBJECT>
    <DATA>
        <ROW>
            <Global_Timestamp>tttt01</Global_Timestamp>
            <Situation_Name>nnn01</Situation_Name>
            <Status>Raised</Status>
            <Atomize></Atomize>
        </ROW>
        <ROW>
            <Global_Timestamp>tttt02</Global_Timestamp>
            <Situation_Name>nnn02</Situation_Name>
            <Status>Reset</Status>
            <Atomize></Atomize>
        </ROW>
        <ROW>
            <Global_Timestamp>tttt03</Global_Timestamp>
            <Situation_Name>nnn03</Situation_Name>
            <Status>Raised</Status>
            <Atomize></Atomize>
        </ROW>
    </DATA>
    </TABLE>
    </SOAP-CHK:Success></SOAP-ENV:Body></SOAP-ENV:Envelope>
    '''
    soup = BeautifulSoup(xml, 'xml')
    for i in soup.find_all('ROW'):
        print(i.text)
    
    

    出力:

    tttt01
    nnn01
    Raised
    
    tttt02
    nnn02
    Reset
    
    tttt03
    nnn03
    Raised
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ javascript - ブートグリッドで行を選択しようとしています