1

私は、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">
            &lt;div class=&quot;header&quot;&gt;
        </p>
        <p id="stuff">
            &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;
        </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

      &lt;div class=&quot;header&quot;&gt;


      &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;

    Das war's!

------
Entities: // well, or no entities above and instead:
// Entities: lt, quot, quot, gt, Uuml, #169

これは可能ですか?XHTML を解析し、いくつかの変更を加えてから、そのように XHTML として再度出力したいと考えています。だから私はエンティティが結果に残ることを本当に望んでいます。

また、Uuml が EntityReference イベントとして報告される理由もわかりませんが、残りはそうではありません。

4

3 に答える 3

2

ちょっとした用語:&#x169;は数字参照 (エンティティではない) であり&#auml;、エンティティ参照 (エンティティではない) です。

XML パーサーが数字参照をアプリケーションに報告することはないと思います - それらは常に展開されます。実際、アプリケーションは、属性間にどれだけの空白があるかを気にする以上に、これを気にするべきではありません。

エンティティ参照に関しては、SAX などの低レベルの解析インターフェイスは、エンティティ参照の存在を報告します。いずれにせよ、属性コンテンツではなく要素コンテンツで発生すると報告します。ContentHandler ではなく、LexicalHandler にのみ通知される特別なイベントがあります。

于 2011-09-12T12:26:59.603 に答える
1

「Uuml が EntityReference イベントとして報告され、残りはそうではない理由」に対する答えは、残りは XML 仕様で定義されているのに対し、HTML 4.0&Uuml;に固有のものであるということです。

あなたの目標は変更された XHTML を書くことなので、「エンコーディング」を「US-ASCII」に設定したり、「メソッド」を「html」に設定したりすることで、シリアライザーに数値エンティティ参照を強制的に発行させることができる場合があります。XSLT 仕様(Java XML シリアライザーの基礎となるもの) では、メソッドが html の場合、シリアライザーは「文字エンティティ参照を使用して文字を出力する可能性がある」と述べています。名前付きエンティティがサポートされていない場合、エンコーディングを ASCII に設定すると、数値エンティティを使用するように強制される場合があります。

于 2011-09-12T11:59:49.440 に答える
-2

Java では、正規表現を使用します。

public static void main(String... args) throws IOException {
  BufferedReader buf = new BufferedReader(new FileReader(args[0]));
  Pattern entity = Pattern.compile("&([^;]+);");
  Set<String> entities = new LinkedHashSet<String>();
  for (String line; (line = buf.readLine()) != null; ) {
    Matcher m = entity.matcher(line);
    while (m.find())
      entities.add(m.group(1));
  }
  buf.close();
  System.out.println("Entities: " + entities);
}

版画

Entities: [lt, quot, gt, Uuml, #169]
于 2011-09-12T09:52:29.357 に答える