использование Python для преобразования XML в Json и запуска запроса после API - PullRequest
0 голосов
/ 28 сентября 2019

Я ищу решение для преобразования XML в Json и использования Json в качестве полезной нагрузки для пост-запроса.

Я стремлюсь к следующей логике:

  1. искать все root.listing.scedules.s и анализировать @s @d @p @ c.

  2. в root.listing.programs parse @t [p.id = @p(из расписаний)] -> «Главное обсуждение»

3, в root.listing.channels parse @c [c.id = @c (из сценариев)] -> «mychannel«

как только я проанализирую всю информацию, я хочу создать JSON, содержащий все параметры, и отправить его с помощью запроса post

Я также ищу решение, которое вызовет несколько API постов, так какколичество элементов root.listing.scedules.s

{
"time":"{@s}",
"durartion":"{@d}",
"programID":"{@p}",
"title":"{@t}",
"channelName":"{@c}",
}

<?xml version="1.0" encoding="UTF-8"?>
<root>
<listings>
<schedules>
<s s="2019-09-26T00:00:00" d="1800" p="1569735" c="100007">
<f id="3" />
</s>
</schedules>
<programs>
<p id="1569735" t="Prime Discussion" d="Discussion on Current Affairs." rd="Discussion on Current Affairs." l="en">
<f id="2" />
<f id="21" />
<k id="6" v="20160614" />
<k id="1" v="2450548" />
<k id="18" v="12983658" />
<k id="21" v="12983658" />
<k id="10" v="Program" />
<k id="19" v="SH024505480000" />
<k id="20" v="http://tmsimg.com/assets/p12983658_b_h5_aa.jpg" />
<c id="607" />
<r o="1" r="1" n="100" />
<r o="2" r="1" n="1000" />
<r o="3" r="1" n="10000" />
</p>
</programs>
</listings>
<channels>
<c id="100007" c="mychannel" l="Prime Asia TV SD" d="Prime Asia TV SD" t="Digital" iso639="hi" />
<c id="10035" c="AETV" l="A&amp;amp;E Canada" d="A&amp;amp;E Canada" t="Digital" u="WWW.AETV.COM" iso639="en" />
</channels>
</root>

В настоящее время я использую этот код для анализа элементов scedules.s (часть 1) и мне нужна помощь с деталями 2,3,4

import xml.etree.ElementTree as ET
tree = ET.parse('ChannelsProgramsTest.xml')
root = tree.getroot()
for sched in root[0][0].findall('s'):
    new = sched.get('s'),sched.get('p'),sched.get('d'),sched.get('c')
    print(new)

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Я все еще немного новичок в использовании Stackoverflow, но не годами.Я думаю, что это несколько дублирующий вопрос, но я пока не знаю, как пометить его как дубликат.


Очень хорошее объяснение XML для JSON через Python приведено в следующем посте авторапредлагается библиотека.


Преобразование XML в JSON с использованием Python?


В источнике данных могут быть неизвестные символы, которые вам нужно будет кодироватьесли вы не используете библиотеку


, т. е. символы новой строки, символы Юникода, другие «случайные» символы.Часто библиотеки уже сделали это для вас, и вам не нужно заново изобретать колесо.

0 голосов
/ 28 сентября 2019

Ниже (я думаю, что это основное решение, которое вы искали)

import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<root>
   <listings>
      <schedules>
         <s s="2019-09-26T00:00:00" d="1800" p="1569735" c="100007">
            <f id="3" />
         </s>
      </schedules>
      <programs>
         <p id="1569735" t="Prime Discussion" d="Discussion on Current Affairs." rd="Discussion on Current Affairs." l="en">
            <f id="2" />
            <f id="21" />
            <k id="6" v="20160614" />
            <k id="1" v="2450548" />
            <k id="18" v="12983658" />
            <k id="21" v="12983658" />
            <k id="10" v="Program" />
            <k id="19" v="SH024505480000" />
            <k id="20" v="http://tmsimg.com/assets/p12983658_b_h5_aa.jpg" />
            <c id="607" />
            <r o="1" r="1" n="100" />
            <r o="2" r="1" n="1000" />
            <r o="3" r="1" n="10000" />
         </p>
      </programs>
   </listings>
   <channels>
      <c id="100007" c="mychannel" l="Prime Asia TV SD" d="Prime Asia TV SD" t="Digital" iso639="hi" />
      <c id="10035" c="AETV" l="A&amp;amp;E Canada" d="A&amp;amp;E Canada" t="Digital" u="WWW.AETV.COM" iso639="en" />
   </channels>
</root>'''

tree = ET.fromstring(xml)
listings = tree.findall('.//listings')
for entry in listings:
    # This is the first requirement: find s,d,p,c under 's' element
    s = entry.find('./schedules/s')
    print(s.attrib)
    # now that we have s,d,p,c we can move on and look for the program with a specific id
    program = entry.find("./programs/p[@id='{}']".format(s.attrib['p']))
    print(program.attrib['t'])
    # find the channel
    channel = tree.find(".//channels/c[@id='{}']".format(s.attrib['c']))
    print(channel.attrib['c'])

output

{'s': '2019-09-26T00:00:00', 'd': '1800', 'p': '1569735', 'c': '100007'}
Prime Discussion
mychannel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...