Разбор PDML / XML и выбор определенных c полей для Pandas - PullRequest
0 голосов
/ 01 апреля 2020

Я использую ElementTree XML API и пытаюсь проанализировать большой файл PDML (XML) в Python. Я пытаюсь получить табличный вывод Pandas данных с указанными c полями информации. Ниже приведено подмножество фактического файла.

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?>
<!-- You can find pdml2html.xsl in C:\Program Files\Wireshark or at https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=pdml2html.xsl. -->
<pdml version="0" creator="wireshark/3.2.2" time="Sun Mar 22 23:53:43 2020" capture_file="C:\Users\anyoung\AppData\Local\Temp\wireshark_Wi-Fi 2_20200322234518_a20824.pcapng">
<packet>
  <proto name="geninfo" pos="0" showname="General information" size="66">
    <field name="frame.cap_len" showname="Capture Length: 66 bytes (528 bits)" size="0" pos="0" show="66"/>
    <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
    <field name="frame.cap_len" showname="Capture Length: 66 bytes (528 bits)" size="0" pos="0" show="66"/>
    <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
    <field name="caplen" pos="0" show="66" showname="Captured Length" value="42" size="66"/>
    <field name="timestamp" pos="0" show="Mar 22, 2020 23:45:34.045301000 Pacific Daylight Time" showname="Captured Time" value="1584945934.045301000" size="66"/>
  </proto>

Я хочу получить таблицу типа:

field            size    value
frame.cap_len    0       null
frame.marked     0       null
timestamp        66      1584945934.045301000

Я действительно борюсь с синтаксисом, чтобы сделать выше. Я не смог получить ничего, что даже близко подойдет.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вот еще один пример XSLT (это больше для @Kristian).

XML Ввод (ввод. xml)

<pdml version="0" creator="wireshark/3.2.2" time="Sun Mar 22 23:53:43 2020" capture_file="C:\Users\anyoung\AppData\Local\Temp\wireshark_Wi-Fi 2_20200322234518_a20824.pcapng">
    <packet>
        <proto name="geninfo" pos="0" showname="General information" size="66">
            <field name="frame.cap_len" showname="Capture Length: 66 bytes (528 bits)" size="0" pos="0" show="66"/>
            <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
            <field name="frame.cap_len" showname="Capture Length: 66 bytes (528 bits)" size="0" pos="0" show="66"/>
            <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
            <field name="caplen" pos="0" show="66" showname="Captured Length" value="42" size="66"/>
            <field name="timestamp" pos="0" show="Mar 22, 2020 23:45:34.045301000 Pacific Daylight Time" showname="Captured Time" value="1584945934.045301000" size="66"/>
        </proto>
    </packet>
</pdml>

XSLT 1.0 (test.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:variable name="tab" select="'&#x9;'"/>
  <xsl:variable name="nl" select="'&#xA;'"/>

  <xsl:template match="/">
    <xsl:value-of select="concat('field',$tab,'size',$tab,'value',$nl)"/>
    <xsl:apply-templates select=".//field"/>
  </xsl:template>

  <xsl:template match="field">
    <xsl:value-of select="concat(@name,$tab,@size,$tab,@value,$nl)"/>
  </xsl:template>

</xsl:stylesheet>

Python 3

from lxml import etree

tree = etree.parse("input.xml")
xslt = etree.parse("test.xsl")

new_tree = tree.xslt(xslt)

print(new_tree)

Печатная продукция

field   size    value
frame.cap_len   0   
frame.marked    0   
frame.cap_len   0   
frame.marked    0   
caplen  66  42
timestamp   66  1584945934.045301000
0 голосов
/ 02 апреля 2020

l xml

https://lxml.de/xpathxslt.html

l xml позволит вам преобразовывать XML документы с использованием XSLT. По какой-то причине XSLT игнорируется, и вместо этого используются объекты программирования методом грубой силы. Тем не менее, я предпочитаю использовать XLST при обработке и преобразовании XML данных.

Я настоятельно рекомендую изучать XSLT и использовать его регулярно, если вам необходимо обрабатывать XML данных ежедневно.

XLST для преобразования вашего XML документа: packet.xsl

Переменные используются для разделителя и конца строки (EOL) для упрощения модификации.

Шаблоны для строки заголовка и поля используются для разрешения перестановки или добавления новых полей при необходимости.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" media-type="string" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="delimiter" select="'&#x9;'"/>
    <xsl:variable name="EOL" select="'&#xA;'"/>

    <xsl:template match="/pdml/packet/proto">
        <xsl:call-template name="header-row"/>
        <xsl:apply-templates match="field"/>
    </xsl:template>

    <xsl:template match="field">
        <xsl:value-of select="@name"/>
        <xsl:value-of select="$delimiter"/>
        <xsl:value-of select="@size"/>
        <xsl:value-of select="$delimiter"/>
        <xsl:value-of select="@value"/>
        <xsl:value-of select="$EOL"/>
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template name="header-row">
        <xsl:element name="row">
            <xsl:text>field</xsl:text>
            <xsl:value-of select="$delimiter"/>
            <xsl:text>size</xsl:text>
            <xsl:value-of select="$delimiter"/>
            <xsl:text>value</xsl:text>
            <xsl:value-of select="$EOL"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Пример Python Код преобразования XML / XSLT

Используйте сценарий python, предоставленный @ Дэниел Хейли Я только что назвал свой файл test.py

Выполнить XSLT с XML input

  • XSLT = packet.xsl
  • XML = package. xml

Предполагается, что ваш пакет. xml является правильно сформированным XML документом, а не неполным документом.

./test.py

Вывод с разделителями табуляции.

field   size    value
frame.cap_len   0   
frame.marked    0   
frame.cap_len   0   
frame.marked    0   
caplen  66  42
timestamp   66  1584945934.045301000
...