如何使用 httpPost() 函数从 p5.js JavaScript 库中获取 post xml 数据(例如 xml 文件)?

How to post xml data(for eg. a xml file) from the p5.js JavaScript library using the httpPost() function?

我正在尝试使用 p5.js 中的 loadXML() 函数加载我计算机本地保存的 XML 文件,然后使用 httpPost() 函数来 POST 与通过以下代码期望 XML 文件的服务器相同:

var url = "http://localhost:9000";
var file;
function preload(){
 file = loadXML("filename,xml"); 
 }
function setup(){
 httpPost(url,"xml",file,success,failure);

 }
 function success(){}//some stuff to run when it is successful 
 function failure(){}// when an error is produced.

但我不断收到以下错误:

p5.js:59782 Uncaught (in promise) TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)
    at p5.httpDo (p5.js:59782)
    at p5.httpPost (p5.js:59634)
    at setup (sketch.js:20)
    at p5.<anonymous> (p5.js:46215)
    at _runIfPreloadsAreDone (p5.js:46163)
    at p5._decrementPreload (p5.js:46173)
    at p5.js:59339
    at p5.js:59851

xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
        <ENVELOPE>
            <HEADER>
                <VERSION>1</VERSION>
                <TALLYREQUEST>Export</TALLYREQUEST>
                <TYPE>Data</TYPE>
                <ID>List of Ledgers</ID>
            </HEADER>
        <BODY>
        <DESC>
        <TDL>
        <TDLMESSAGE>
        <REPORT NAME="List of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <FORMS>List of Ledgers</FORMS>
        </REPORT>
        <FORM NAME="List of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <TOPPARTS>List of Ledgers</TOPPARTS>
        <XMLTAG>"List of Ledgers"</XMLTAG>
        </FORM>
        <PART NAME="List of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <TOPLINES>List of Ledgers</TOPLINES>
        <REPEAT>List of Ledgers : Collection of Ledgers</REPEAT>
        <SCROLLED>Vertical</SCROLLED>
        </PART>
        <LINE NAME="List of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <LEFTFIELDS>List of Ledgers</LEFTFIELDS>
        </LINE>
        <FIELD NAME="List of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <SET>$Name</SET>
        <XMLTAG>"NAME"</XMLTAG>
        </FIELD>
        <COLLECTION NAME="Collection of Ledgers" ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No">
        <TYPE>Ledger</TYPE>
        </COLLECTION>
        </TDLMESSAGE>
        </TDL>

        </DESC>
        </BODY>
        </ENVELOPE>

编辑 1: 我尝试使用 loadStrings() 函数,它使用以下代码与 httpPost 方法完美配合 -

list = loadStrings("ListLedgers.xml");    
function setup(){  
list = list.join('');  
httpPost(url,"xml",list,yay,oops);  
}  

如果我是你,我会尝试做一些更简单的工作。你能用 XML 的更基本的部分让它工作吗?您可以对 XML 进行硬编码,看看是否可行吗?

如果你 google 你的错误 "Converting circular structure to JSON at JSON.stringify" 你会得到很多结果。基本上,如果对象包含循环引用,则不能将其转换为 JSON。

然后查看 P5.js reference,您会注意到 p5.XML 类型包含一个循环引用及其 getParent() 函数。

这是导致错误的原因:httpPost() 函数正试图将您的 XML 转换为 JSON,但它不能这样做,因为它包含循环引用。

要解决您的问题,您有以下几种选择:

  • 找出 httpPost() 函数将 XML 转换为 JSON 的原因。这闻起来像个错误,所以我会进行更多调试以弄清楚发生了什么。
  • 您可以将 XML 转换为字符串。 getContent() 函数在这里可能有所帮助。
  • 您可以将 XML 作为文本或字节加载,而不是将其加载为 XML。

以上只是猜测,因为我实际上无法 运行 您的代码,但希望这能让您畅通无阻。祝你好运。