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(...)method に parameter があることはわかっていますdoctype: DocTypeが、開いたばかりの XML からこれを取得するにはどうすればよいですか?

4

1 に答える 1

1

オブジェクトには、次のXMLシグネチャを持つメソッドがあります。

def loadXML(source: InputSource, parser: SAXParser): Elem

これにより、を指定できますSaxParser。次のシグネチャを持つメソッドを持つaを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 に答える