Как получить список XPATH атрибутов, используя Python? - PullRequest
0 голосов
/ 21 июня 2020

Как мне получить список атрибутов XPATH, используя Python?

Спасибо за рассмотрение моего вопроса в этом форуме. Многие высоко отзывались об этом форуме Python, поэтому я ищу информацию о своих проблемах.

Я пытаюсь перечислить все пути Xpath входного файла с помощью разработчика кода Python после просмотра множества тем на этом форуме .

Вот ввод XML Сообщение.

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2012</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Вот Python Код для использования вышеуказанного XML Сообщение:


         

    import xml.etree.ElementTree as ET
    from lxml import etree
    infile = 'D:\Python_work\eclipse-workspace\My1stPythonP\CountryData.xml'
    output ="D:\\Python_work\\eclipse-workspace\\My1stPythonP\\outfile.out"
    tree = etree.parse(infile)
    root = tree.getroot()
    f = open(output,'w') #open write to file
    count = tree.xpath("count(.//country)")
    print (count)
    f.write("%s\n" %(count))
    xpathf = root.find('.//country')
    print(xpathf.get("value"))
    xpathf = root.find('.//data/country/year')
    print(xpathf.get("value"))
    print (tree.getroot() )
    xmlstr = ET.tostring(root,  method='xml')
    root1 = ET.fromstring(xmlstr)
     
    tree1 = etree.ElementTree(root)
    for e in root.iter():
         f.write("%s\n" %(tree1.getpath(e)))
    f.close()


Мне нужна помощь этого форума, чтобы получить следующий вывод списка XPATH с использованием ввода сообщения XML и кода Python с l xml. Я пробовал с размещенным кодом Python. Он создает XPATH для XML элементов опубликованного входного сообщения XML, но не создает XPATH для атрибутов опубликованного входного сообщения XML. Примеры отсутствующих атрибутов XPATH показаны курсивом ниже. Вывод списка XPATH

Вывод списка XPATH



/data
/data/country
*/data/country/@name*
/data/country/rank
/data/country/year
/data/country/gdppc
/data/country/neighbor[1]
*/data/country/neighbor[1]/@name*
*/data/country/neighbor[1]/@direction*
/data/country/neighbor[2]
*/data/country/neighbor[2]/@name*
*/data/country/neighbor[2]/@direction*
/data/country[2]
*/data/country[2]/@name*
/data/country[2]/rank
/data/country[2]/year
/data/country[2]/gdppc
/data/country[2]/neighbor
*/data/country[2]/neighbor/@name*
*/data/country[2]/neighbor/@direction*
/data/country[3]
*/data/country[3]/@name*
/data/country[3]/rank
/data/country[3]/year
/data/country[3]/gdppc
/data/country[3]/neighbor[1]
*/data/country[3]/neighbor[1]/@name*
*/data/country[3]/neighbor[1]/@direction*
/data/country[3]/neighbor[2]
*/data/country[3]/neighbor[2]/@name*
*/data/country[3]/neighbor[2]/@direction*

  1. "tree1.getpath (e)" получение список XPATH, но атрибут XPATHS отсутствует в списке. Какое изменение в коде требуется для включения Xpaths атрибутов?

Я хочу извлечь значение на основе XPATH. Используя извлечение на основе XPATH, вот выходные данные, я хочу сообщить как


Country_name  Rank Year Gdppc    Neighbor    Direction
============  ==== ==== =====    ========    ==========

Liechtenstein   1   2008 141100  Austria      East
                                 Switzerland  West

Singapore       4   2011 59900   Malaysia     North

Panama          68  2012 13600   Costa Rica   West
                                 Colombia     East     


Каким способом извлекается значение атрибута на основе XPATH?

Если во входном файле есть пространство имен spe c, приведенный выше код создает Список XPATH как

/ * / / [1] / / [2] / / [2] / [1 ] / / [2] / [2] / / [2] / [3] / / [2] / [4] / / [2] / [5] / / [2] / [6]

Есть ли способы получить читаемый XPATH с помощью Python, когда входной файл содержит пространство имен spe c? ​​

Спасибо за ваше руководство.

1 Ответ

1 голос
/ 23 июня 2020

Я считаю, что вы сделали это немного сложнее, чем необходимо. Попробуйте это так:

import pandas as pd
rows = []
for country in root.xpath('//country'):
    row = []
    name = country.xpath('./@name')[0]
    rank = country.xpath('rank/text()')[0]
    year = country.xpath('year/text()')[0]
    gdppc = country.xpath('gdppc/text()')[0]
    neigh = ' '.join(country.xpath('neighbor/@name'))
    dirc = ' '.join(country.xpath('neighbor/@direction')).replace("E","East").replace("W","West").replace("N","North")
    row.extend([name,rank,year,gdppc,neigh,dirc])
    rows.append(row)
columns = ["Country_name",  "Rank", "Year", "Gdppc", "Neighbor", "Direction"]
pd.DataFrame(rows)

Вывод:

    Country_name    Rank Year   Gdppc   Neighbor               Direction
0   Liechtenstein   1   2008    141100  Austria Switzerland     East West
1   Singapore       4   2011    59900   Malaysia                North
2   Panama          68  2012    13600   Costa Rica Colombia     West East
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...