Преобразование XML-файла Atom или OData в файл OData Json с использованием Python

#python #powershell #sharepoint #xmltodict #xml-to-json

Вопрос:

Я пытался преобразовать сценарий PowerShell в код Python, чтобы загрузить файлы списка из Sharepoint. Большая часть части кодирования завершена и хорошо выполнена на данный момент. Однако, когда я загружаю файл с Sharepoint на локальный диск с помощью .расширение json, содержимое файла не соответствует ожиданиям.

Тип содержимого списка Sharepoint => > content-type: application/atom xml;type=feed;charset=utf-8 , который находится в формате xml. Поскольку я не смог сохранить содержимое в формате .json, я загрузил файл в формате .xml и преобразовал его в .json, используя пакет xmltodict python, который пока хорош.

Вот мой фактический запрос : как мы можем загрузить xml-контент с помощью .json или преобразуйте xml-файл в файл json без типов атрибутов, тегов и пространств имен и т.д.? Нам нужно, чтобы файл был загружен в формате, сгенерированном ниже сценарием PowerShell, без каких-либо тегов и только с парами ключ-значение.

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

Это содержимое веб-URL Sharepoint, которое находится в формате atom xml/Odata xml.

 <?xml version="1.0" encoding="utf-8"?><feed xml:base="https://myorg.sharepoint.com/sites/pwaeng/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"

<d:Created m:type="Edm.DateTime">2018-05-09T21:21:03Z</d:Created><d:AuthorId m:type="Edm.Int32">1344</d:AuthorId><d:EditorId m:type="Edm.Int32">1344</d:EditorId><d:OData__UIVersionString>1.0</d:OData__UIVersionString><d:Attachments m:type="Edm.Boolean">false</d:Attachments><d:GUID m:type="Edm.Guid">9ef38bd1-a098-4610-98a4-dbf7488a5a27</d:GUID></m:properties></content></entry></feed>
 

Это преобразованные в Python данные json

 {"feed": {"@xml:base": "https://myorg.sharepoint.com/sites/pwaeng/_api/", "@xmlns": "http://www.w3.org/2005/Atom", "@xmlns:d": "http://schemas.microsoft.com/ado/2007/08/dataservices",

"d:Created": {"@m:type": "Edm.DateTime", "#text": "2018-05-09T21:21:03Z"}, "d:AuthorId": {"@m:type": "Edm.Int32", "#text": "1344"}, "d:EditorId": {"@m:type": "Edm.Int32", "#text": "1344"}, "d:OData__UIVersionString": "1.0", "d:Attachments": {"@m:type": "Edm.Boolean", "#text": "false"}, "d:GUID": {"@m:type": "Edm.Guid", "#text": "9ef38bd1-a098-4610-98a4-dbf7488a5a27"}}}}}}
 

PowerShell загрузил файл Json

{«odata.метаданные»:»https://myorg.sharepoint.com/sites/pwaeng/_api/$метаданные#SP.Данные списка.Program_x0020_RisksListItems»,»значение»:[{«odata.type»:»SP.Данные.Program_x0020_RisksListItem»,»odata.id»:»a878d166-c19d-4c16-82b4-e150e7e49626″,»odata.etag»:»»2″»,»odata.editLink»:»Web/Lists

 "Created":"2018-05-09T21:21:03Z","AuthorId":1344,"EditorId":1344,"OData__UIVersionString":"1.0","Attachments":false,"GUID":"9ef38bd1-a098-4610-98a4-dbf7488a5a27"}]}
 

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

      listURL = webAbsoluteURL   
    "/_api/web/lists/GetByTitle('"   List   "')/items"
   

   #print(listURL)
   count = 0
   #print(type(str(count)))
   fileName = "file_"   ListFolder.strip()   "_"   str(count)   "_"   date
   #print(fileName)
   xml_output = Filepath   "/"   fileName   ".xml"  ##USe backslash in Windows
   json_output = Filepath   "/"   fileName   ".json"
   #print(output)
   #print(userName, Password)
   url = listURL
   #ctx = ClientContext(url).with_credentials(UserCredential(userName, Password))
   #web = ctx.web.get().execute_query()
   #print("Web title: {0}".format(web.properties['Title']))
   ctx_auth = AuthenticationContext(webAbsoluteURL)
   token = ctx_auth.acquire_token_for_user(userName, Password)
   #ctx = ClientContext(webAbsoluteURL, ctx_auth)
   #print(token)
   options = RequestOptions(webAbsoluteURL)
   ctx_auth.authenticate_request(options)
   #options.headers = {
   #'accept' : 'text/html,application/xhtml xml,application/xml',
   #'content-type': 'application/atom xml;type=feed;charset=utf-8',
   #'X-RequestForceAuthentication' : 'true'
   #}
   response = requests.get(url, headers=options.headers, allow_redirects=True, timeout=60000)
   #print(req.status_code)
   #headers = {
   #'accept' : 'application/json;odata=verbose',
   #'content-type' : 'application/json;odata=verbose',
   #'X-RequestForceAuthentication' : 'true'
   #}
   #response = requests.get(url, allow_redirects=True, headers=headers, timeout=60000)
   #print(response.status_code)
   with open(xml_output, 'wb') as file_save:
      file_save.write(response.content)
   with open(xml_output, 'r', encoding = "UTF-8") as xml_file:
      data_dict = xmltodict.parse(xml_file.read()) # , attr_prefix='')
      xml_file.close()
      #json_data = json.dumps(data_dict, separators=(',', ':'))
      #json_data = json.dumps(data_dict, indent=2)
      json_data = json.dumps(data_dict)
   #with open(json_output, 'w') as json_file:
   #   json.dump(data_dict, json_file)
   #   json_file.close()
   with open(json_output, 'wb') as json_file:
      json_file.write(json_data.encode("UTF-8"))
      json_file.close()
 

Ответ №1:

Найдено решение, Вместо того, чтобы использовать xml для синтаксического анализа json(xmltodict.parse) и т. Д., Простое решение-добавить это «?amp;$format=json» в конец веб-URL.

XML_DATA_URL = https://myorg.sharepoint.com/sites/pwaeng/_api/projectdata/Tasks

JSON_FORMAT_URL = https://myorg.sharepoint.com/sites/pwaeng/_api/projectdata/Tasks?amp;$формат=json

Однако это не работает с URL-адресом следующего типа.

https://myorg.sharepoint.com/sites/pwaeng/_api/web/lists/GetByTitle(«Программные риски»)/пункты

https://myorg.sharepoint.com/sites/pwaeng/_api/web/lists/GetByTitle(«Программные риски»)/пункты?amp;$формат=json

Если у кого-то есть какие-либо предложения, пожалуйста, добавьте свой комментарий здесь..