我的代码是在 Scala.js 中,但我认为从 JavaScript 的 Angular 来看,它的要点应该很容易理解:
def htmlToXHTML(input: String)
(implicit parser: DOMParser, serializer: XMLSerializer): String = {
val doc = parser.parseFromString(input, "text/html")
val body = getElementByXpath("/html/body", doc).singleNodeValue
val bodyXmlString = serializer.serializeToString(body)
val xmldoc = parser.parseFromString(bodyXmlString, "application/xml")
val xmlDocElems: NodeList = xmldoc.getElementsByTagName("*")
xmlDocElems.foreach{
case elem: Element =>
elem.removeAttribute("xmlns")
println(s"Found element $elem with html: ${elem.outerHTML}")
case node => println(s"Warning: found unexpected non-element node: $node.")
}
xmldoc.firstElementChild.innerHTML
}
这在上面使用过,因此为了完整性而将其包括在内( https://stackoverflow.com/a/14284815/3096687 ):
def getElementByXpath(xpath: String, doc: Document): XPathResult =
doc.evaluate(
xpath, doc, null.asInstanceOf[XPathNSResolver],
XPathResult.FIRST_ORDERED_NODE_TYPE, null
)
简而言之,此函数读取 HTML 字符串,将其转换为 HTML 文档,序列化为 XML,重新解析为 XML,然后查找文档中的所有元素并循环遍历它们 (foreach
) ,然后删除 xmlns
属性。然而,生成的innerHTML似乎仍然在元素上具有xmlns
属性,即使第一个println
(又名console.log
)指示我们找到了有问题的元素,但没有删除 xmlns
属性。
问题可能源自default values在 DTD 中指定:
If a default value for the attribute is defined in a DTD, a new attribute immediately appears with the default value
最佳答案
我可能会作弊并从结果字符串中删除 xmlns
,因为它是 huge pain使元素失去其 namespace 。
如果您坚持这样做,您可以尝试在遍历原始 DOM 时从头开始构建文档 - 迂腐地复制除命名空间之外的所有内容(即使用具有空命名空间的 createElementNS?)
关于javascript - 如何在没有 xmlns 属性的情况下序列化 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48343468/