Javascript 如何序列化没有xmlns属性的XML?
我的代码在Scala.js中,但我认为从JavaScript的角度来看,它的要点应该很容易理解: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
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
(akaconsole.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
)