我有一个类似的问题,我想通过以下方式将 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)
}