XMLHttpRequest не может прочитать форму XML InfoPath из-за строки mso-application - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать страницу ASPX на своем сайте SharePoint для чтения существующих форм InfoPath. Локальное тестирование с использованием JavaScript и XMLHttpRequest работало нормально, но когда страница загружается в SharePoint, происходит нечто странное, если в файле XML есть определенная строка данных. При тестировании с простыми файлами XML эта строка вызывает проблему:

<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.4"?>

При наличии в файле XML, который я пытаюсь прочитать, происходит что-то странное. Вместо того, чтобы получить содержимое файла, я получаю то, что выглядит как страница HTML от SharePoint. На странице ничего не отображается и есть ссылки на библиотеки InfoPath и SharePoint. Я понятия не имею, откуда приходит HTML. Удаление этой единственной строки из файла XML заставляет все работать как ожидалось. Запуск вне SharePoint, похоже, тоже работает. Я включу образец XML-файла и код, который я использовал для тестирования.

Обновление: Если расширение входного файла TXT, а не XML, то проблема исчезнет. Я предполагаю, что это означает, что SharePoint выполняет код, когда файлы XML читаются и внедряются в мой запрос get.

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.4"?>
<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2017-05-05T14:19:13">
  <my:User_Name>Joe</my:User_Name>
  <my:Email_Address>joe.smith@abc.com</my:Email_Address>
</my:myFields>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <script src="lib/jquery/jquery-3.4.1.min.js"></script>
    <title></title>

    <script>
            var oReq = new XMLHttpRequest();
            oReq.addEventListener("progress", updateProgress);
            oReq.addEventListener("error", transferFailed);
            oReq.addEventListener("abort", transferCanceled);
            oReq.addEventListener("loadend", transferComplete);

            function Test_Req_xml() {
                console.log("starting test_req_xml function");
                let filename = document.getElementById('inFileName').value;
                console.log("file name " + filename);
                oReq.addEventListener("load", transferComplete_xml);
                oReq.open("GET", filename);
                oReq.responseType = "document";
                oReq.send();
            }
            var transferComplete_xml = function (response) {
                console.log({ 'transferComplete xml response:': response });
                console.log({ 'oReq.responseXML': oReq.responseXML });
                console.log({ 'oReq.responseType': oReq.responseType });
                console.log({ 'oReq.responseURL': oReq.responseURL });
                console.log({ 'oReq': oReq });
                parseFile(oReq.responseXML.documentElement.outerHTML);
            };
            // progress on transfers from the server to the client (downloads)
            function updateProgress(oEvent) {
                if (oEvent.lengthComputable) {
                    var percentComplete = oEvent.loaded / oEvent.total * 100;
                    console.log("percent " + percentComplete);
                } else {
                    // Unable to compute progress information since the total size is unknown
                    console.log("loaded is " + oEvent.loaded);
                }
            }
            function transferComplete(evt) {
                console.log("The transfer is complete.");
            }
            function transferFailed(evt) {
                console.log("An error occurred while transferring the file.");
            }
            function transferCanceled(evt) {
                console.log("The transfer has been canceled by the user.");
            }

            //this will parse XML file and output it to website
            var parseFile = function (text) {
                var xmlDoc = $.parseXML(text),
                    $xml = $(xmlDoc),
                    $email = $xml.find("Email_Address"),
                    $naming = $xml.find("User_Name");
                console.log({ 'xmldoc ': xmlDoc });
                var currentdate = new Date();
                var datetime = currentdate.getDate() + "/" + (currentdate.getMonth() + 1) + "/" + currentdate.getFullYear() + " @ " + currentdate.getHours() + ":" + currentdate.getMinutes() + ":" + currentdate.getSeconds();
                $("#output").empty();
                $("#output").append("<br/>");
                $("#output").append("<span>Date: " + datetime + "</span><br/>");
                $("#output").append("<span>Name: " + $naming.text() + "</span><br/>");
                $("#output").append("<span>Email: " + $email.text() + "</span><br/>");
            };

    </script>

</head>
<body>
    <div class="row m-sm">
        <span>File name: </span><input id="inFileName" type="text" class="form-control" placeholder="" value="test_xml_file3.xml">
    </div>
    <div class="row m-sm">
        <button id="btnTest3" class="btn btn-outline-secondary" type="button" onclick="Test_Req_xml()">Test xml </button>
    </div>
    <div class="row m-sm">
        <ul id="output"></ul>
    </div>

</body>

</html>

1 Ответ

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

Я не совсем уверен, как это происходит, но я предполагаю, что SharePoint Online перехватывает запрос на получение файлов с расширением XML, и когда он находит строку ниже, он пытается выполнить какой-то код для запроса. Я не вижу проблем, когда файл не имеет расширения XML, и при этом я не вижу проблемы, когда строка ниже отсутствует в файле XML. Теперь мне нужно выяснить, есть ли способ обойти это.

<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.4"?>

...