2

假设我们打开一个 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 中获取它?

4

1 回答 1

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)>
于 2013-02-16T10:57:47.340 回答