Разбор XML в python с этри - PullRequest
0 голосов
/ 08 апреля 2020

Я получил XML файл:

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
    <name>antigon</name>
    <SSIDConfig>
        <SSID>
            <name>antigon</name>
        </SSID>
    </SSIDConfig>
    <connectionType>ESS</connectionType>
    <connectionMode>auto</connectionMode>
    <MSM>
        <security>
            <authEncryption>
                <authentication>WPA2PSK</authentication>
                <encryption>AES</encryption>
                <useOneX>false</useOneX>
            </authEncryption>
            <sharedKey>
                <keyType>passPhrase</keyType>
                <protected>false</protected>
                <keyMaterial>THIS IS WHAT I WANNA GET</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
    <MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
        <enableRandomization>false</enableRandomization>
    </MacRandomization>
</WLANProfile>

Я знаю логи c HTML / XML, но я не могу найти, как получить вещь "ЭТО ТО, ЧТО Я WANNA GET ", с Etree и python, оба в последней версии. Может ли кто-нибудь помочь мне? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

См. Документы этот ответ ) для получения подробной информации об обработке пространств имен с ElementTree.

Вот пример:

import xml.etree.ElementTree as ET

ns_map = {"wlan": "http://www.microsoft.com/networking/WLAN/profile/v1"}

tree = ET.parse("input.xml")

print(tree.find(".//wlan:keyMaterial", namespaces=ns_map).text)

печатает ...

THIS IS WHAT I WANNA GET

Если вы хотите изменить это значение и сохранить его в файл, попробуйте что-то вроде этого:

import xml.etree.ElementTree as ET

ns_map = {"wlan": "http://www.microsoft.com/networking/WLAN/profile/v1"}

# Need this to make sure a prefix isn't added to your namespace declaration.
ET.register_namespace("", ns_map.get("wlan"))

tree = ET.parse("input.xml")

try:
    tree.find(".//wlan:keyMaterial", namespaces=ns_map).text = "NEW VALUE!"
except AttributeError:
    print("Unable to modify the keyMaterial value.")

tree.write("output.xml", xml_declaration=True, encoding="utf-8")

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

<?xml version='1.0' encoding='utf-8'?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1" xmlns:ns1="http://www.microsoft.com/networking/WLAN/profile/v3">
    <name>antigon</name>
    <SSIDConfig>
        <SSID>
            <name>antigon</name>
        </SSID>
    </SSIDConfig>
    <connectionType>ESS</connectionType>
    <connectionMode>auto</connectionMode>
    <MSM>
        <security>
            <authEncryption>
                <authentication>WPA2PSK</authentication>
                <encryption>AES</encryption>
                <useOneX>false</useOneX>
            </authEncryption>
            <sharedKey>
                <keyType>passPhrase</keyType>
                <protected>false</protected>
                <keyMaterial>NEW VALUE!</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
    <ns1:MacRandomization>
        <ns1:enableRandomization>false</ns1:enableRandomization>
    </ns1:MacRandomization>
</WLANProfile>

Примечание: ElementTree не справляется с работой более чем с одним пространством имен по умолчанию, поэтому префикс "ns1" добавляется в вывод.

0 голосов
/ 09 апреля 2020

Ниже

import xml.etree.ElementTree as ET
import re

xml = '''<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
    <name>antigon</name>
    <SSIDConfig>
        <SSID>
            <name>antigon</name>
        </SSID>
    </SSIDConfig>
    <connectionType>ESS</connectionType>
    <connectionMode>auto</connectionMode>
    <MSM>
        <security>
            <authEncryption>
                <authentication>WPA2PSK</authentication>
                <encryption>AES</encryption>
                <useOneX>false</useOneX>
            </authEncryption>
            <sharedKey>
                <keyType>passPhrase</keyType>
                <protected>false</protected>
                <keyMaterial>THIS IS WHAT I WANNA GET</keyMaterial>
            </sharedKey>
        </security>
    </MSM>
    <MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
        <enableRandomization>false</enableRandomization>
    </MacRandomization>
</WLANProfile>'''
xml = re.sub(' xmlns="[^"]+"', '', xml, count=1)
root = ET.fromstring(xml)
key_material = root.find('.//keyMaterial')
print(key_material.text)

выход

THIS IS WHAT I WANNA GET
...