5

文字エンティティを含む XML を解析する必要があるプログラムがあります。プログラム自体はそれらを解決する必要はなく、それらのリストは大きく、変更される可能性があるため、可能であればこれらのエンティティの明示的なサポートを避けたい.

簡単な例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>

(非標準の) 文字エンティティを解決せずにドキュメントを正常に解析できる Java XML API はありますか? 理想的には、それらを特別に処理できる特別なイベントまたはオブジェクトに変換することですが、私はそれらを黙って抑制するオプションに落ち着きます.

答えと例:

Skaffman は私に答えをくれました: IS_REPLACING_ENTITY_REFERENCESfalse に設定された StAX パーサーを使用してください。

これを試すために作成したコードは次のとおりです。

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
XMLEventReader reader = inputFactory.createXMLEventReader(
    new FileInputStream("your file here"));

while (reader.hasNext()) {
    XMLEvent event = reader.nextEvent();
    if (event.isEntityReference()) {
        EntityReference ref = (EntityReference) event;
        System.out.println("Entity Reference: " + ref.getName());
    }
}

上記の XML の場合、" Entity Reference: something" が出力されます。

4

4 に答える 4

8

STaX APIは、IS_REPLACING_ENTITY_REFERENCESプロパティを使用して、文字エンティティ参照を置き換えないという概念をサポートしています。

パーサーは、内部エンティティ参照をそれらの置換テキストで置換し、それらを文字として報告する必要があります

これをに設定して、またはXmlInputFactoryを作成するために使用できます。ただし、APIは、このプロパティは、実装に置換を強制するのではなく、実装に置換を強制することのみを目的としていると注意深く述べてます。それでも、試してみる価値はあります。XmlEventReaderXmlStreamReader

于 2009-11-22T09:49:21.590 に答える
1

外部エンティティのサポートを無効にする場合にのみ機能します。

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
于 2013-02-07T10:27:00.397 に答える
0

私は Java 開発者ではありませんが、これを実現するために、Java xml クラスは .net と同様の機能をサポートしていると「思います」。.net xmlreadersettings クラスで、ProhibitDtd プロパティを false に設定し、XmlResolver プロパティを null に設定します。これにより、パーサーは外部参照されたエンティティーを、読み取り時に例外をスローすることなく無視します。「Java ignore enity」をグーグルで検索したところ、多くのヒットがあり、そのうちのいくつかはこのトピックに対処しているようです。これはあなたの質問に対する完全な答えではないことは承知していますが、有益な方向性を示しているはずです。

于 2009-11-22T18:51:17.857 に答える
0

org.xml.sax.EntityResolverを使用した SAX 解析が目的に合う場合があります。あなたは確かにそれらを抑圧することができ、おそらくそれらを未解決のままにしておく方法を見つけることができます.

このチュートリアルが最も関連性が高いと思われます。エンティティを文字列に解決する方法を示しています。

于 2009-11-22T07:17:46.923 に答える