9

与えられた

<field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.time_relative" showname="Time since reference or first frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.number" showname="Frame Number: 2" size="0" pos="0" show="2"/>
<field name="frame.pkt_len" showname="Packet Length: 1506 bytes" hide="yes" size="0" pos="0" show="1506"/>
<field name="frame.len" showname="Frame Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.cap_len" showname="Capture Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
<field name="frame.protocols" showname="Protocols in frame: eth:ip:tcp:http:data" size="0" pos="0" show="eth:ip:tcp:http:data"/>

すべてのタグを繰り返し処理して属性を確認せずに、name = "frame.len"のフィールドをすぐに取得するにはどうすればよいですか?

4

3 に答える 3

15

私はあなたができるとは思わない。

親からelement、あなたはする必要があります

for subelement in element.GetElementsByTagName("field"):
    if subelement.hasAttribute("frame.len"):
        do_something()

3月11日のコメントに反応して、ドキュメントの構造が安定していて、厄介な驚き(属性内の山かっこなど)がない場合は、考えられないことを試して正規表現を使用することをお勧めします。これは推奨される方法ではありませんが、実際にファイルを解析するよりも機能し、はるかに簡単です。私は時々自分でそれをしたことを認めます。まだ盲目になっていない。

したがって、あなたの場合、(<field>タグが複数の行にまたがっていないと仮定して)次のことができます。

xmlfile = open("myfile.xml")
for line in xmlfile:
    match = re.search(r'<field\s+name="frame.len"\s+([^>]+)/>', line):
    if match:
        result = match.group(1)
        do_something(result)

<field>タグが複数行にまたがることができる場合は、ファイル全体をプレーンテキストとしてメモリにロードしてから、一致するものをスキャンしてみてください。

filedump = open("myfile.xml").read()
for match in re.finditer(r'<field\s+name="frame.len"\s+([^>]+)/>', filedump):
    result = match.group(1)
    do_something(result)

どちらの場合も、resultには以外の属性が含まれますframe.lenframe.len正規表現は、それが常にタグ内の最初の属性であると想定しています。

于 2010-03-10T07:19:52.257 に答える
2

あなたはそうではありません-DOMAPIは、(Pythonではなくw3cによって)設計がやや不十分ですが、反復を実行するためのそのような検索関数がありません。ループする必要性を受け入れるか(一般的にすべてのタグを介してではなく、指定されたタグ名を持つすべてを介して)、またはなどのよりリッチなインターフェイスにアップグレードしBeautifulSoupますlxml

于 2010-03-10T07:18:37.960 に答える
0

うわー、その正規表現はひどいです!2016年の時点で、.getAttribute()それぞれDOMElementに少し簡単な方法がありますが、それでも要素を反復処理する必要があります。

l = []
for e in elements:
    if e.hasAttribute('name') and e.getAttribute('name') == 'field.len':
        l.append(e)
于 2016-07-25T11:11:46.550 に答える