Как заменить значение блока кода XML внутри файла JSON с помощью скрипта Python - PullRequest
0 голосов
/ 28 марта 2019

Я хочу создать скрипт Python, который анализирует файл JSON.Внутри файла JSON есть структура XML.Я хочу заменить определенное поле этой структуры XML новым значением.Чтобы быть более конкретным, я пытаюсь заменить поле «isteredBy »новым значением, которое я хочу.Мне нужно сделать это для нескольких файлов, поэтому мне нужен скрипт.

Я новичок в Python.Пока что я могу открыть файл JSON и создать новое значение (закомментированный код Python).Я все еще пытаюсь выяснить, как ввести блок кода XML и заменить нужное поле новым значением.

Любые предложения о том, что / где читать, приветствуются.

Спасибо.

{
    "creationDate": 1542716832357,
    "id": "15f66daf-1fc3-46b5-9d0e-915bc8058c52",
    "payload": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tns:service xmlns:tns=\"http://example.com\"><tns:category>data</tns:category><tns:description>Service Description.</tns:description><tns:serviceMetadata><tns:registeredAt>1542386903532</tns:registeredAt><tns:registeredBy>George Papadopoulos</tns:registeredBy></tns:serviceMetadata></tns:service>",
    "resource": {
        "creationDate": 1542386903542,
        "id": "0b5dd030-af5e-4b1a-8be3-1b5e195615e2",
        "modificationDate": 1549460188076,
        "payload": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tns:service xmlns:tns=\"http://example.com\"><tns:category>data</tns:category><tns:description>Service Description.</tns:description><tns:serviceMetadata><tns:registeredAt>1542386903532</tns:registeredAt><tns:registeredBy>George Papadopoulos</tns:registeredBy></tns:serviceMetadata></tns:service>",
        "payloadFormat": "xml",
        "resourceTypeName": "service",
        "version": "02062019133628"
    }
}
import json

with open('this.json', 'r') as json_file:
     json_data = json.load(json_file)
     for item in json_data:
           if item['registeredBy'] in ["George Papadopoulos"]:
              item['registeredBy'] = "Nick"
with open('this.json', 'w') as file:
    json.dump(json_data, json_file, indent=2)


#with open('this.json', 'r') as json_file:
#    json_data = json.load(json_file)
#    json_data['registeredBy'] = "Nick"
#
#with open('this.json', 'w') as json_file:
#    json_file.write(json.dumps(json_data))

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы хотите разбить его на 3 шага:

  1. Parse Json
  2. Разбор XML
  3. сохранить изменения

Во-первых, получите часть XML от json

import json

with open('this.json', 'r') as json_file:
     json_data = json.load(json_file)

# this is the first payload, the payload under resource seems identical 
# so we will copy the updated xml over after the change
xml = json_data['payload']

Во-вторых, измените данные XML. Вам может понадобиться установить bs4 и lxml пакеты

from bs4 import BeautifulSoup

xml_data = BeautifulSoup(xml, 'xml')
for tag in xml_data.find_all('tns:registeredBy'):
    tag.string='0' # change '0' to whatever you want

Наконец, сохранить изменения обратно

json_data['payload'] = str(xml_data)
json_data['resource']['payload'] = json_data['payload']  # we can just copy the same xml over, since they were the same before change

# write to file
with open('this.json', 'w') as json_file:
    json.dump(json_data, json_file, indent=2)
0 голосов
/ 28 марта 2019

Вы можете просто выполнить строковые манипуляции.

Преобразовать JSON в строку, затем .replace(), а затем записать обратно в файл:

json_data = {
    "creationDate": 1542716832357,
    "id": "15f66daf-1fc3-46b5-9d0e-915bc8058c52",
    "payload": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tns:service xmlns:tns=\"http://example.com\"><tns:category>data</tns:category><tns:description>Service Description.</tns:description><tns:serviceMetadata><tns:registeredAt>1542386903532</tns:registeredAt><tns:registeredBy>George Papadopoulos</tns:registeredBy></tns:serviceMetadata></tns:service>",
    "resource": {
        "creationDate": 1542386903542,
        "id": "0b5dd030-af5e-4b1a-8be3-1b5e195615e2",
        "modificationDate": 1549460188076,
        "payload": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tns:service xmlns:tns=\"http://example.com\"><tns:category>data</tns:category><tns:description>Service Description.</tns:description><tns:serviceMetadata><tns:registeredAt>1542386903532</tns:registeredAt><tns:registeredBy>George Papadopoulos</tns:registeredBy></tns:serviceMetadata></tns:service>",
        "payloadFormat": "xml",
        "resourceTypeName": "service",
        "version": "02062019133628"
    }
}



import json

jsonStr = json.dumps(json_data).replace('<tns:registeredBy>George Papadopoulos</tns','<tns:registeredBy>Nick</tns')
with open('C:/this.json', 'w') as file:
    json.dump(json.loads(jsonStr), file, indent=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...