SAXまたはStAXを使用してXHTMLファイルを読みたい。 しかし、エンティティの解決や置き換えなどは望んでいません。 理想的には、彼らはそのままであるべきです。 私はDTDを使いたくありません。以下のXHTMLファイルを考えるとJava - XMLを読み込み、すべてのエンティティだけを残す
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(", "))
...
<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イベントとして報告されている理由はわかりませんが、残りはそうではありません。
正規表現を使用してXMLを解析しようとするほとんどの人と同様、間違っています。たとえば、あなたの正規表現は、コメントやCDATAセクションに現れる実体的なものを拾います。コメントにセミコロンがついていないアンパサンドが含まれていると、混乱の原因となります。 XMLを解析するために正規表現を使用しないでください - あなたはいつもそれを間違ってしまいます。ダウン投票。 –
@Michael Kay、なぜそれが悪いのかという良い説明です。あなたが私が持っているよりも "野性的な" XMLを見つけたのではないかと思う。私が見たXMLは、通常目的のために設計されています。 –