Javascript 如何序列化没有xmlns属性的XML?

Javascript 如何序列化没有xmlns属性的XML?,javascript,dom,scala.js,Javascript,Dom,Scala.js,我的代码在Scala.js中,但我认为从JavaScript的角度来看,它的要点应该很容易理解: def htmlToXHTML(input: String) (implicit parser: DOMParser, serializer: XMLSerializer): String = { val doc = parser.parseFromString(input, "text/html") val body = getElementByXpath("/html/b

我的代码在Scala.js中,但我认为从JavaScript的角度来看,它的要点应该很容易理解:

  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
  }
这是上面使用的,因此为了完整性()将其包括在内:

简而言之,此函数读取HTML字符串,将其转换为HTML文档,序列化为XML,重新解析为XML,并查找文档中的所有元素并在其上循环(
foreach
),然后删除
xmlns
属性。然而,尽管第一个
println
(aka
console.log
)表明我们正在查找有问题的元素,但并没有删除
xmlns
属性,但生成的innerHTML似乎仍然在元素上具有
xmlns
属性

问题可能源于DTD中指定的:

如果在DTD中定义了属性的默认值,则会立即显示一个具有默认值的新属性


我可能会作弊,并从结果字符串中删除
xmlns
,因为这是一个让元素丢失名称空间的错误


如果您坚持这样做,您可以尝试在遍历原始DOM的同时从头开始构建文档——学究式地复制名称空间以外的所有内容(即使用空名称空间的CreateElements?

我只是尝试
elem.setAttribute(“xmlns”),而不是remove,但是结果很奇怪:
-我想它不能很好地处理缺少名称空间的问题。您误解了domapi的工作原理。即使删除了xmlns属性,元素的限定名仍然包含其名称空间URI。将xmlns属性视为命名空间URI的交叉检查,而不是命名空间URI本身。@Alohci,谢谢,是的,我想我在某种程度上理解了这一点,这最终更多的是序列化格式的问题(但是
XMLSerializer
似乎不可配置,所以我试图解决这个问题)
  def getElementByXpath(xpath: String, doc: Document): XPathResult =
    doc.evaluate(
      xpath, doc, null.asInstanceOf[XPathNSResolver],
      XPathResult.FIRST_ORDERED_NODE_TYPE, null
    )