我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。
关闭 1 年前。
我正在尝试将 HTML 映射到结构完整的 JSON。是否有任何图书馆可以做到这一点,或者我需要自己编写?我想如果那里没有 html2json 库,我可以从 xml2json 库开始。毕竟,html 只是 xml 的变种,对吧?
更新:好的,我应该举个例子。我正在尝试做的是以下内容。解析一串html:
<div>
<span>text</span>Text2
</div>
像这样进入一个 json 对象:
{
"type" : "div",
"content" : [
{
"type" : "span",
"content" : [
"Text2"
]
},
"Text2"
]
}
注意:如果您没有注意到标签,我正在寻找 Javascript 中的解决方案
最佳答案
我刚刚写了这个函数来做你想做的事;试试看,如果它不适合您,请告诉我:
// Test with an element.
var initElement = document.getElementsByTagName("html")[0];
var json = mapDOM(initElement, true);
console.log(json);
// Test with a string.
initElement = "<div><span>text</span>Text2</div>";
json = mapDOM(initElement, true);
console.log(json);
function mapDOM(element, json) {
var treeObject = {};
// If string convert to document Node
if (typeof element === "string") {
if (window.DOMParser) {
parser = new DOMParser();
docNode = parser.parseFromString(element,"text/xml");
} else { // Microsoft strikes again
docNode = new ActiveXObject("Microsoft.XMLDOM");
docNode.async = false;
docNode.loadXML(element);
}
element = docNode.firstChild;
}
//Recursively loop through DOM elements and assign properties to object
function treeHTML(element, object) {
object["type"] = element.nodeName;
var nodeList = element.childNodes;
if (nodeList != null) {
if (nodeList.length) {
object["content"] = [];
for (var i = 0; i < nodeList.length; i++) {
if (nodeList[i].nodeType == 3) {
object["content"].push(nodeList[i].nodeValue);
} else {
object["content"].push({});
treeHTML(nodeList[i], object["content"][object["content"].length -1]);
}
}
}
}
if (element.attributes != null) {
if (element.attributes.length) {
object["attributes"] = {};
for (var i = 0; i < element.attributes.length; i++) {
object["attributes"][element.attributes[i].nodeName] = element.attributes[i].nodeValue;
}
}
}
}
treeHTML(element, treeObject);
return (json) ? JSON.stringify(treeObject) : treeObject;
}
工作示例:http://jsfiddle.net/JUSsf/ (在 Chrome 中测试,我不能保证完全支持浏览器 - 您必须对此进行测试)。
它以您请求的格式创建一个包含 HTML 页面树结构的对象,然后使用大多数现代浏览器(IE8+、Firefox 3+)中包含的 JSON.stringify()
。ETC);如果您需要支持旧版浏览器,您可以添加 json2.js .
它可以采用 DOM 元素或包含有效 XHTML 的 string
作为参数(我相信,我不确定 DOMParser()
是否会阻塞某些情况,因为它设置为 "text/xml"
或者它是否不提供错误处理。不幸的是 "text/html"
浏览器支持不佳)。
您可以通过传递不同的值作为 element
轻松更改此函数的范围。您传递的任何值都将成为 JSON 映射的根。
https://stackoverflow.com/questions/12980648/