【问题标题】:is parseXML() able to parser an URL instead of str?parseXML() 是否能够解析 URL 而不是 str?
【发布时间】:2017-10-04 14:23:49
【问题描述】:

请检查此代码,如果我在 $.parseXML 中使用 URL,则 documentElement 将不起作用。

我正在尝试将此 XML file 传递到表中。但是如果使用 URL 解析器,则 parseXML 将不起作用。

var xml = $.parseXML("<ExtractSummaryDateSet><_date>2017-09-20</_date><_portfolioSummaries><ExtractSummaryDateSetDetail><_portfolioName>52613661</_portfolioName><_detail><Before>0</Before><After>-329</After><ChangeMaturing>0</ChangeMaturing><ChangeNew>-329</ChangeNew></_detail></ExtractSummaryDateSetDetail><ExtractSummaryDateSetDetail><_portfolioName>52613661_LP</_portfolioName><_detail><Before>0</Before><After>-329</After><ChangeMaturing>0</ChangeMaturing><ChangeNew>-329</ChangeNew></_detail></ExtractSummaryDateSetDetail><ExtractSummaryDateSetDetail><_portfolioName>526136|Total</_portfolioName><_detail><Before>0</Before><After>-329</After><ChangeMaturing>0</ChangeMaturing><ChangeNew>-329</ChangeNew></_detail></ExtractSummaryDateSetDetail></_portfolioSummaries></ExtractSummaryDateSet>");
var extractTableData = function(x){
  var detailField = [];
  detailField.push({});
  detailField[0].title = 'Name';
  detailField[0].values = [];
  for (var i =0; i<x.length; i++){
      detailField[0].values.push(x[i].childNodes[0].innerHTML);
      var detail = x[i].childNodes[1].childNodes;
      for(var j =0 ; j<detail.length; j++){
         var detailf = detailField.find(function(arr){
         			return arr.title === detail[j].localName 
         });
      	 if(!detailf){
        	detailField.push({
          	'values' : [],
            'title' : null
          });
          detailField[detailField.length -1].values.push(detail[j].innerHTML);
          detailField[detailField.length -1].title = detail[j].localName;
         }
         else{
         	detailf.values.push(detail[j].innerHTML);
         }
      }
     }
  return detailField;
};

$(document).ready(function(){
        $("#test1").html(function(i, origText){
          debugger;
          var doc = xml.documentElement;
          var table = "<table>";
          table+= "<tr><th>"+doc.childNodes[0].localName+"</th><td>"+doc.childNodes[0].innerHTML+"</td></tr>"+   
            "<tr><th>"+doc.childNodes[1].localName+"</th><td>_</td>";
          table+="</table>";
         
          table+="<hr>"
          var x = doc.childNodes[1].childNodes;
          var tableData = extractTableData(x);
          table+="<table>"
          for(var i=0; i<tableData.length; i++)
          {
          	 table+="<tr><th>"+tableData[i].title+"</th>";
             for(var j=0;j<tableData[i].values.length;j++){
             		table+="<td>"+tableData[i].values[j]+"</td>"
             }
             table+="</tr>"
          }
          return table+="</table>";
    });   
});
table {  
    color: #333; /* Lighten up font color */
    font-family: Helvetica, Arial, sans-serif; /* Nicer font */
    width: 640px; 
    border-collapse: 
    collapse; border-spacing: 0; 
}

td, th { border: 1px solid #CCC; height: 30px; } /* Make cells a bit taller */

th {  
    background: #F3F3F3; /* Light grey background */
    font-weight: bold; /* Make sure they're bold */
}

td {  
    background: #FAFAFA; /* Lighter grey background */
    text-align: center; /* Center our text */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<body>
  <div id="test1">Table</div>
</body>

场景

我在 parseXML 中找到的大多数文档都使用直接导入,例如

var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>",


xmlDoc = $.parseXML( xml ),

是否可以这样做

xhttp.open("GET", "URL", true);
var xml = xhttp.responseXML;
xmlDoc = $.parseXML( xml )

我知道responseXML不是单独使用parseXML,只是一个例子来展示$.parseXML的场景,它可以直接从URL调用还是有其他方法可以做到?

【问题讨论】:

  • 是的,这是可能的,尽管您需要在onreadystate 更改事件 解析XML。或者,您可以使用 jQuery 为您获取 XML 响应,它会自动为您解析它。
  • 嗯,responseXML 已经被解析了......你只需要正确使用 XMLHttpRequest 对象,并在请求完成时读取它。
  • 你能举个例子吗?
  • 要使用document元素是什么意思?

标签: javascript jquery xml


【解决方案1】:

由于您已经在使用 jQuery,您可以使用 $.get(url, callback) 对 URL 执行 Ajax 提取,然后在响应中自动检测 XML,并为回调提供解析的 Document 对象:

$.get("https://myurl/file.xml", function(xml) {
    // parsed document named `xml` exists in here
});
// parsed document does not exist out here

您需要稍微重构您的代码,因为$.parseXML 是同步的并立即返回其结果,而网络获取是异步的,并将它们的值提供给将来调用的回调函数。如果您需要帮助了解如何进行重组以允许异步 Ajax 获取,请参阅How do I return the response from an asynchronous call?

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2020-02-26
    • 2021-08-25
    • 2022-08-08
    • 2022-11-01
    相关资源
    最近更新 更多