Как разобрать файл XML, хранящийся на моем диске Google, но который выделяется как тип HTML? - PullRequest
3 голосов
/ 08 октября 2019

Как проанализировать XML-файл, хранящийся на моем диске Google, но который выделяется как html-тип?!

Я сохраняю в своем облаке Google Drive копию xml источника: http://api.allocine.fr/rest/v3/movie?media=mp4-lc&partner=YW5kcm9pZC12Mg&profile=large&version=2&code=265621 Я могу разобрать исходный код, но не могу разобрать xml копию, которая выглядит как HTML-тип !! У меня есть ошибка синтаксического анализа, как: тип элемента "мета" должен быть завершен с помощью соответствующего конечного тега "" или тип элемента "a.length" должен сопровождаться либо спецификации атрибутов, ">" или "/>" Я поделился этимна https://drive.google.com/file/d/16kJ5Nko-waVb8s2T12LaTEKaFY01603n/view?usp=sharing, чтобы дать вам доступ и проверить мой скрипт. Я знаю, что могу использовать cacheService, и он работает, но для другого управления буферизацией я попробую вот так

function xmlParsingXmlStoreOnGoogleDrive(){
     //So , this is the original xml that is good parsed
 var fetched=UrlFetchApp.fetch("http://api.allocine.fr/rest/v3/movie?media=mp4-lc&partner=YW5kcm9pZC12Mg&profile=large&version=2&code=265621")
 var blob=fetched.getBlob();
 var getAs=blob.getAs("text/xml")
 var data=getAs.getDataAsString("UTF-8")
 Logger.log(data.substring(1,350)); // substring to not saturate the debug display this expected code XML:
 /*
    ?xml version="1.0" encoding="utf-8"?>
    <!-- Copyright © 2019 AlloCiné -->
    <movie code="265621" xmlns="http://www.allocine.net/v6/ns/">
    <movieType code="4002">Long-métrage</movieType>
    <originalTitle>Mise à jour sur Google play</originalTitle>
    <title>Mise à jour sur Google play</title>
    <keywords>Portrait of a Lady on Fire </keywords>
 */
 var xmlDocument=XmlService.parse(data);
 var root=xmlDocument.getRootElement();
 var keywords=root.getChild("keywords",root.getNamespace()).getText();
 Logger.log(keywords);  // Display the expected result :"Portrait of a Lady on Fire "

 // And this my copie of the original xml, that i can't parsing
 var fetched=UrlFetchApp.fetch("https://drive.google.com/file/d/1K3-9dHy-h0UoOOY5jYfiSoYPezSi55h1/view?usp=sharing")
 var blob=fetched.getBlob();
 var getAs=blob.getAs("text/xml")
 var data=getAs.getDataAsString("UTF-8")
 Logger.log(data.substring(1,350)); // substring to not saturate the debug display this non expected code HTML !:
 /*
   !DOCTYPE html><html><head><meta name="google" content="notranslate"><meta http-equiv="X-UA-Compatible" content="IE=edge;">
   <style>@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),
   url(//fonts.gstatic.com/s/roboto/v18/KFOkCnqEu92Fr1Mu51xIIzc.ttf)format('truetype');}@font-face{font-fam......
 */
 var xmlDocument=XmlService.parse(data); // ABORT WITH THE ERROR: Element type "a.length" must be followed by either attribute specifications, ">" or "/>"
 var root=xmlDocument.getRootElement();
 var keywords=root.getChild("keywords",root.getNamespace()).getText();
 Logger.log(keywords);
}

Я прочитал на этот похожий вопрос: Разобрать файл XML (который хранится вGoogleDrive) со скриптом приложения Google

, что «К сожалению, мы не можем напрямую получить XML-файлы на диске Google» !! Правильно ли это и означает ли это, что я не могу реализовать свой сценарий?

Ответы [ 2 ]

3 голосов
/ 08 октября 2019
  • Вы хотите извлечь данные из файла на Google Диске и проанализировать их как данные XML с помощью XmlService.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа?

Точки модификации:

Модифицированный скрипт:

Например, если используется ваш общий файл примера https://drive.google.com/file/d/16kJ5Nko-waVb8s2T12LaTEKaFY01603n/view?usp=sharing, сценарий выглядит следующим образом.

Пример сценария 1:

В этом шаблоне содержимое файлаизвлекается из вашего общего файла с помощью UrlFetchApp.fetch().

var data = UrlFetchApp.fetch("https://drive.google.com/uc?id=16kJ5Nko-waVb8s2T12LaTEKaFY01603n&export=download").getContentText(); // Modified
var xmlDocument=XmlService.parse(data);
var root=xmlDocument.getRootElement();
var keywords=root.getChild("keywords",root.getNamespace()).getText();
Logger.log(keywords); // <--- You can see "Portrait of a Lady on Fire" at log.
  • В этом случае сценарий должен быть открыт для общего доступа. Если вы хотите получить содержимое файла без совместного использования, используйте для доступа токен доступа.

Пример сценария 2:

В этом шаблоне содержимое файла извлекается из общего ресурса. файл с DriveApp.getFileById().

var fileId = "16kJ5Nko-waVb8s2T12LaTEKaFY01603n"; // Added
var data = DriveApp.getFileById(fileId).getBlob().getDataAsString(); // Added
var xmlDocument=XmlService.parse(data);
var root=xmlDocument.getRootElement();
var keywords=root.getChild("keywords",root.getNamespace()).getText();
Logger.log(keywords); // <--- You can see "Portrait of a Lady on Fire" at log.

Ссылки:

  • Файлы Drive API
    • webContentLink: ссылка для загрузки содержимого файла в браузер с использованием аутентификации на основе файлов cookie. В случаях, когда содержимое является общедоступным, его можно загрузить без каких-либо учетных данных.
  • getFileById (id)

Если я неправильно понял ваш вопрос, а это не то направление, которое вы хотите, прошу прощения.

0 голосов
/ 08 октября 2019

Замечательно! Вы пишите. Ваши два предложения работают. Я просто сделал ошибку в другом месте в моем коде. Так что решение 1 больше не работает. Именно поэтому дайте новый скрипт для его проверки. Только для моего обучения, потому что мой проект безопасен благодаря вам:)

function storeXmlOnGoogleDriveThenParsIt(url){
  url=url||"http://api.allocine.fr/rest/v3/movie?media=mp4-lc&partner=YW5kcm9pZC12Mg&profile=large&version=2&code=265621"; // to test
  // on my Google Drive i make a copi of the url called. (This to preserve the server from too many request.)
  var bufferedXml=DriveApp.getRootFolder().searchFolders('title = "BufferFiles"').next().createFile("xmlBuffered.xml", UrlFetchApp.fetch(url).getContentText(),MimeType.PLAIN_TEXT);
  var urlBufferedXml=bufferedXml.getUrl()   // The new url ,of the buffered file
  var fileId=urlBufferedXml.match(/https:\/\/drive.google.com\/file\/d\/(.*)\/view.*/)[1];


  //Now i want to pars the buffered xml file
  //[ Your seconde way to get data is working perect ! THANK YOU A LOT !!!
  var data = DriveApp.getFileById(fileId).getBlob().getDataAsString(); 
  var xmlDocument=XmlService.parse(data);                              
  var root=xmlDocument.getRootElement();
  var mynamespace=root.getNamespace();
  var keywords=root.getChild("keywords",root.getNamespace()).getText();
  Logger.log("keywords:"+keywords)                            // and parsing success ]


  //[ The first way to get data was ok BUT DAMNED it now aborting ! Since modifications on the line code that create the xml, and i cant' retrieve the right code
  var downloadUrlBufferedXml="https://drive.google.com/uc?id="+fileId+"&export=download";
  var data = UrlFetchApp.fetch(downloadUrlBufferedXml).getContentText(); // was good but now data is here again like a html text ! :(
  Logger.log("data"+data.substring(1,350)); // this show that data is HTML type and not XML type !  :(
  var xmlDocument=XmlService.parse(data);  // So i have Error like: The element type "meta" must be terminated by the matching end-tag "</meta>"  ]
  var root=xmlDocument.getRootElement();
  var mynamespace=root.getNamespace();
  var keywords=root.getChild("keywords",root.getNamespace()).getText();
  Logger.log("keywords:"+keywords)
}
...