私は、SAX または StAX を使用して XHTML ファイルを読みたいと思っています。しかし、エンティティを解決したり、置き換えたりしたくありません。理想的には、そのままにしておく必要があります。私は DTD を使いたくありません。
以下は (実行可能、Scala 2.8.x を使用) の例です。
import javax.xml.stream._
import javax.xml.stream.events._
import java.io._
println("StAX Test - "+args(0)+"\n")
val factory = XMLInputFactory.newInstance
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false)
factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false)
println("------")
val xer = factory.createXMLEventReader(new FileReader(args(0)))
val entities = new collection.mutable.ArrayBuffer[String]
while (xer.hasNext) {
val event = xer.nextEvent
if (event.isCharacters) {
print(event.asCharacters.getData)
} else if (event.getEventType == XMLStreamConstants.ENTITY_REFERENCE) {
entities += event.asInstanceOf[EntityReference].getName
}
}
println("------")
println("Entities: " + entities.mkString(", "))
次のxhtmlファイルを考えると...
<html>
<head>
<title>StAX Test</title>
</head>
<body>
<h1>Hallo StAX</h1>
<p id="html">
<div class="header">
</p>
<p id="stuff">
Überdies sollte das hier auch als Copyright sichtbar sein: ©
</p>
Das war's!
</body>
</html>
...実行scala stax-test.scala stax-test.xhtml
すると、次のようになります。
StAX Test - stax-test.xhtml
------
StAX Test
Hallo StAX
<div class="header">
berdies sollte das hier auch als Copyright sichtbar sein: ?
Das war's!
------
Entities: Uuml
そのため、すべてのエンティティが多かれ少なかれ正常に置き換えられました。私が期待していたのは、しかし、私が欲しいのはこれです:
StAX Test - stax-test.xhtml
------
StAX Test
Hallo StAX
<div class="header">
Überdies sollte das hier auch als Copyright sichtbar sein: ©
Das war's!
------
Entities: // well, or no entities above and instead:
// Entities: lt, quot, quot, gt, Uuml, #169
これは可能ですか?XHTML を解析し、いくつかの変更を加えてから、そのように XHTML として再度出力したいと考えています。だから私はエンティティが結果に残ることを本当に望んでいます。
また、Uuml が EntityReference イベントとして報告される理由もわかりませんが、残りはそうではありません。