假设我们打开一个XHTML文件:
val parser = new XhtmlParser(io.Source.fromFile(filename))
val doc = parser.initialize.document
可以获取文档的DTD:doc.dtd
。当我像下一行一样保存XML时,不会保存DOCTYPE。
XML.save("out.xhtml", docRootElem, enc = "UTF-8", xmlDecl = true)
我知道XML.save(...)
方法有一个参数doctype: DocType
,但是如何从刚刚打开的XML中获取它?
答案 0 :(得分:1)
XML
对象的方法具有以下签名:
def loadXML(source: InputSource, parser: SAXParser): Elem
这允许您提供SaxParser
。您可以为SaxParser
LexicalHandler
提供一个具有以下签名的方法:
void startDTD(String name, String publicId, String systemId)
你可以覆盖它。一个例子:
var r = ("", "", "")
val handler = new DefaultHandler2 {
override def startDTD(name:String, publicId:String, systemId:String) = {
r = (name, publicId, systemId)
}
}
val parser = SAXParserFactory.newInstance().newSAXParser()
parser.setProperty("http://xml.org/sax/properties/lexical-handler", handler)
val source = Source fromString """<?xml version="1.0"?>
<!DOCTYPE wikiarticle SYSTEM "wikiarticle.dtd">
<wikiarticle>
<art type="redirect">
<redirect>#REDIRECT[[page]]</redirect>
</art>
</wikiarticle>
"""
XML.loadXML(source, parser)
println(r) // (wikiarticle,null,wikiarticle.dtd)
要运行该示例,您需要一个dtd,您可以使用:
<!ELEMENT wikiarticle (art)>
<!ELEMENT art (redirect, redirect?, article?)>
<!ATTLIST art type CDATA #REQUIRED>
<!ELEMENT redirect (#PCDATA)>
<!ELEMENT article (#PCDATA)>