我有一个类似的问题,我想通过以下方式将 HTML 表示为 JSON:
- 对于 HTML 文本节点,使用
string
- 对于 HTML 元素,使用一个数组:
- 元素的(标签)名称
- 一个对象,将属性键映射到属性值
- 子节点的(内联)列表
例子:
<div>
<span>text</span>Text2
</div>
变成
[
'div',
{},
['span', {}, 'text'],
'Text2'
]
我编写了一个函数来处理将 DOM 元素转换为这种 JS 结构。您可以在此答案的末尾找到此功能。该函数是用 Typescript 编写的。您可以使用Typescript playground将其转换为干净的 JavaScript。
此外,如果您需要将 html 字符串解析为 DOM,请分配给.innerHtml
:
let element = document.createElement('div')
element.innerHtml = htmlString
此外,这是常识,但如果您需要 JSON 字符串输出,请使用JSON.stringify
.
/**
* A NodeDescriptor stands for either an (HTML) Element, or for a text node
*/
export type NodeDescriptor = ElementDescriptor | string
/**
* Array representing an HTML Element. It consists of:
*
* - The (tag) name of the element
* - An object, mapping attribute keys to attribute values
* - The (inlined) list of children nodes
*/
export type ElementDescriptor = [
string,
Record<string, string>,
...NodeDescriptor[]
]
export let htmlToJs = (element: Element, trim = true): ElementDescriptor => {
let convertElement = (element: Element): ElementDescriptor => {
let attributeObject: Record<string, string> = {}
for (let { name, value } of element.attributes) {
attributeObject[name] = value
}
let childArray: NodeDescriptor[] = []
for (let node of element.childNodes) {
let converter = htmlToJsDispatch[node.nodeType]
if (converter) {
let descriptor = converter(node as any)
let skip = false
if (trim && typeof descriptor === 'string') {
descriptor = descriptor.trim()
if (descriptor === '') skip = true
}
if (!skip) childArray.push(descriptor)
}
}
return [element.tagName.toLowerCase(), attributeObject, ...childArray]
}
let htmlToJsDispatch = {
[element.ELEMENT_NODE]: convertElement,
[element.TEXT_NODE]: (node: Text): string => node.data,
}
return convertElement(element)
}