0

次のようなXMLドキュメントがあるとします。

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>&title;</title>
 </doc>  

上記のXMLドキュメントを解析し、すべてのエンティティが既に解決された状態でそのコピーを生成したいと思いました。したがって、上記のXMlドキュメントが与えられると、パーサーは次のように出力する必要があります。

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>Stack Overflow Madness</title>
 </doc>  

org.xml.sax.EntityResolverを実装してエンティティを解決できることは知っていますが、私が知らないのは、すべてがそのままの状態でXMLドキュメントのコピーを適切に生成する方法です(エンティティを除く)。すべての意味で、空白、ドキュメントの上部にあるdtd、コメント、および以前に解決されているはずのエンティティを除くその他のものを意味します。これが不可能な場合は、少なくともほとんどのものを保存できる方法を提案してください(たとえば、コメントを除いてすべて)。

また、Sunが提供する純粋なJava APIに制限されているため、ここではサードパーティのライブラリを使用できないことにも注意してください。

どうもありがとう!

編集:上記のXMLドキュメントは、元のドキュメントを大幅に簡略化したものです。元の例では、EntityResolverを使用した非常に複雑なエンティティ解決が含まれていますが、この質問ではその重要性が大幅に低下しています。私が本当に興味を持っているのは、EntityResolverを使用してエンティティを解決するXMLパーサーを使用してXMLドキュメントの正確なコピーを作成する方法です。

4

2 に答える 2

1

xmlテンプレートを文字列として読み取ることは可能ですか?そして文字列で次のようなことをします

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
于 2009-10-29T06:40:22.620 に答える
1

私が聞いたことのあるXMLパーサーを使用してこれを行うことはほぼ確実にできません。また、SunXMLパーサーはそれを行うことができません。XMLの意味に関する限り、意味のない詳細は喜んで破棄されます。例えば、

<title>Stack Overflow Madness</title>

<title >Stack Overflow Madness</title >

XML構文の観点からは区別がつかず、Sunパーサーは(正しく)それらを同一として扱います。

あなたの選択は、XMLをテキストとして扱う置換を行うか(@Wololoが示唆するように)、要件を緩和することだと思います。

ちなみに、おそらくXMLパーサーとは独立してXmlEntityResolverを使用できます。または、同じことを行うクラスを作成します。これは答えではないことを意味するかもしれString.replace...ませんが、文字バッファー内の文字を反復処理して2番目の文字に展開するアドホックエクスパンダーを実装できるはずです。

于 2009-10-29T06:51:36.373 に答える