如何在Scala中获取XML文档的DOCTYPE?

时间:2013-02-15 20:51:20

标签: xml scala doctype

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

1 个答案:

答案 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)>