ユーザーが提供した HTML を受け取り、それを別の HTML コードに変換する Web アプリケーション用のプラグインを作成しています。私はほとんどの場合、指定されたクラス/コンテンツ (「ディレクティブ」) を持つすべての要素を見つけて、それを別のものに書き換えたいと考えています。私は Scala 2.11.1 と TagSoup パーサーを使用して、XML に適していないコードを処理しています。
現時点での私の主な問題は、呼び出しがXML.parseString("<div></div>")
yield することです:
scala> XML.loadString("<div></div>")
res2: scala.xml.Elem = <div/>
このタグを最小化しないままにしたいので、この動作は結果のページ (つまりiframe
、s、 s など) を文字化けさせます。div
読み込み段階でこの動作を回避する方法はありますか?
2 番目の問題は、TagSoup に関連しています。次のようなコード ブロックを解析する場合:
<script type="javascript">console.log("Hello");</script>
TagSoup は次のように解析します。
<script type="javascript">console.log("Hello");</script>
これらの問題を回避するためにできることはありますか? <script>
これまでのところ、すべての要素を最小化されないように書き換えたり、タグのコンテンツからすべてのエンティティを削除したりするなど、「厄介な」ソリューションしか思いつきませんでした。
TagSoup の解析は次のように行われます。
import java.net.URL
import org.ccil.cowan.tagsoup.jaxp.SAXFactoryImpl
import org.xml.sax
import org.xml.sax.InputSource
import scala.xml._
import parsing.NoBindingFactoryAdapter
object HTML {
lazy val adapter = new NoBindingFactoryAdapter
lazy val parser = (new SAXFactoryImpl).newSAXParser()
def load(source: InputSource) = adapter.loadXML(source, parser)
def loadString(source: String) = load(Source.fromString(source))
def loadURL(url: URL) = load(new sax.InputSource(url.openConnection().getInputStream))
}