javascript - 如何在没有 xmlns 属性的情况下序列化 XML?

标签 javascript dom scala.js

我的代码是在 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/

相关文章:

javascript - 如何在window.open函数中传递php变量

shell - 如何在 ammonite shell (amm) 中使用 scala-js

scala - 在 scalajs 的 scalatest 之前异步

javascript - 从 Javascript 数组创建按钮数组

javascript - 我可以 $.wrap() 围绕数组中的元素集合吗?

scala.js - 是否可以组合两个 js.Dynamic 对象

javascript - 检查线索是否已知,然后根据电子邮件地址重定向到页面

javascript - dojo:在自己的类中实例化一个对象

javascript - 使用javascript对堆栈元素进行排序

javascript - 使用 getElementById 更改样式背景属性