8

私のXML文字列は -

xmlData = """<SMSResponse xmlns="http://example.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
             <Cancelled>false</Cancelled>
             <MessageID>00000000-0000-0000-0000-000000000000</MessageID>  
             <Queued>false</Queued>
             <SMSError>NoError</SMSError>
             <SMSIncomingMessages i:nil="true"/>
             <Sent>false</Sent>
             <SentDateTime>0001-01-01T00:00:00</SentDateTime>
             </SMSResponse>"""

タグの値を解析して取得しようとしています-Cancelled、MessageId、SMSErrorなど。PythonのElementtreeライブラリを使用しています。これまでのところ、次のようなことを試しました-

root = ET.fromstring(xmlData)
print root.find('Sent')  // gives None
for child in root:
    print chil.find('MessageId') // also gives None

ただし、タグを印刷することはできます-

for child in root:
    print child.tag
    //child.tag for the tag Cancelled is - {http://example.com}Cancelled

とそれぞれの値 -

for child in root:
    print child.text

どうすれば次のようなものを取得できますか-

print child.Queued // will print false

PHPのように、ルートでアクセスできます-

$xml = simplexml_load_string($data);
$status = $xml->SMSError;
4

4 に答える 4

8

ドキュメントには名前空間が含まれているため、検索時に名前空間を含める必要があります。

root = ET.fromstring(xmlData)
print root.find('{http://example.com}Sent',)
print root.find('{http://example.com}MessageID')

出力:

<Element '{http://example.com}Sent' at 0x1043e0690>
<Element '{http://example.com}MessageID' at 0x1043e0350>

およびメソッドも名前空間マップを取りますfind()findall()任意のプレフィックスを検索できます。プレフィックスはそのマップで検索され、入力を節約できます。

nsmap = {'n': 'http://example.com'}
print root.find('n:Sent', namespaces=nsmap)
print root.find('n:MessageID', namespaces=nsmap)
于 2013-01-04T09:14:13.277 に答える
3

Python 標準 XML ライブラリに設定されている場合は、次のようなものを使用できます。

root = ET.fromstring(xmlData)
namespace = 'http://example.com'

def query(tree, nodename):
    return tree.find('{{{ex}}}{nodename}'.format(ex=namespace, nodename=nodename))

queued = query(root, 'Queued')
print queued.text
于 2013-01-04T09:22:38.363 に答える
2

lxml.etree

In [8]: import lxml.etree as et

In [9]: doc=et.fromstring(xmlData)

In [10]: ns={'n':'http://example.com'}

In [11]: doc.xpath('n:Queued/text()',namespaces=ns)
Out[11]: ['false']

あなたと一緒elementtreeにできること:

import xml.etree.ElementTree as ET    
root=ET.fromstring(xmlData)    
ns={'n':'http://example.com'}
root.find('n:Queued',namespaces=ns).text
Out[13]: 'false'
于 2013-01-04T09:35:52.197 に答える
2

辞書を作成して、そこから値を直接取得できます...

tree = ET.fromstring(xmlData)

root = {}

for child in tree:
    root[child.tag.split("}")[1]] = child.text

print root["Queued"]
于 2013-01-04T09:05:53.670 に答える