最近接到一份工作,看似很普通,將文章用ajax讀取然後瀏覽器滾動的時候動態加載文章,但是問題來了,文章源接口是以XML提供的,文章源與前端又不在一個網域下,這就牽涉到XML跨域問題,但是文章來源提供了可以用xslt的抓取系統,這樣XML就可以轉成html了,那麼可以將html轉成json然後跨網域存取嗎?或者xslt可以直接將xml轉成json跨域存取嗎?
滿天的星座2017-05-19 10:44:37
建構子並導出(可改為class)
function XmlToJson() {}
XmlToJson.prototype.setXml = function(xml) {
if (xml && typeof xml == "string") {
this.xml = document.createElement("p");
this.xml.innerHTML = xml;
this.xml = this.xml.getElementsByTagName("*")[0];
} else if (typeof xml == "object") {
this.xml = xml;
}
};
XmlToJson.prototype.getXml = function() {
return this.xml;
};
XmlToJson.prototype.parse = function(xml) {
this.setXml(xml);
return this.convert(this.xml);
};
XmlToJson.prototype.convert = function(xml) {
if (xml.nodeType != 1) {
return null;
}
var obj = {};
obj.xtype = xml.nodeName.toLowerCase();
var nodeValue = (xml.textContent || "").replace(/(\r|\n)/g, "").replace(/^\s+|\s+$/g, "");
if (nodeValue && xml.childNodes.length == 1) {
obj.text = nodeValue;
}
if (xml.attributes.length > 0) {
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj[attribute.nodeName] = attribute.nodeValue;
}
}
if (xml.childNodes.length > 0) {
var items = [];
for (var i = 0; i < xml.childNodes.length; i++) {
var node = xml.childNodes.item(i);
var item = this.convert(node);
if (item) {
items.push(item);
}
}
if (items.length > 0) {
obj.items = items;
}
}
return obj;
};
export { XmlToJson };
xml範本字串
let xml = `<viewport id="menuPane" layout="border">
<panel region="center" border="0" layout="border">
<tbar>
<toolbar text="XXXX">
<menu>
<text text="11">
</text>
<text text="22">
</text>
<text text="33">
</text>
</menu>
</toolbar>
<toolbar text="XXXX">
<menu>
<text text="44">
</text>
<text text="55">
</text>
<menu>
<text text="6 6">
</text>
</menu>
<text text="77">
</text>
</menu>
</toolbar>
</tbar>
</panel>
</viewport>`;
呼叫方法轉xml為json並輸出到console查看
import { XmlToJson } from './xmlToJson.js';
let xmlParser = new XmlToJson();
let json = xmlParser.parse(xml);
console.log(JSON.stringify(json));//输出xml转换后的json