2

dom4j で XML ファイルを読み込んでいます。ファイルは次のようになります。

...
<Field>&#13;&#10; hello, world...</Field>
...

SAXReaderでファイルを読み取りますDocument。ノードで使用するgetText()と、次の文字列を取得します。

\r\n hello, world...

いくつかの処理を行ってから、を使用して別のファイルを書き込みますasXml()。ただし、元のファイルのように文字がエスケープされないため、ファイルを使用する外部システムでエラーが発生します。

&#13;&#10;ファイルの書き込み時に特殊文字をエスケープして使用するにはどうすればよいですか?

4

4 に答える 4

1

簡単にはできません。それらは「エスケープ」ではなく、「キャラクター エンティティ」です。それらは XML の基本的な部分です。Xerces は「解析されていないエンティティ」を非常に複雑にサポートしていますが、DTD で定義されている種とは対照的に、これらに適用されるとは思えません。

于 2010-02-12T13:20:34.200 に答える
1

それはあなたが得ているものとあなたが望むものに依存します(私の以前のコメントを参照してください.)

SAX リーダーは何も悪いことをしていません。XML はリテラルな改行文字を提供しています。この XML を制御する場合は、改行文字の代わりに \ (バックスラッシュ) 文字を挿入し、その後に「r」または「n」文字 (または両方) を挿入する必要があります。

この XML を制御しない場合は、文字列を取得した後で、改行文字を "\r\n" にリテラル変換する必要があります。C# では、次のようになります。

myString = myString.Replace("\r\n", "\\r\\n");
于 2010-02-12T13:21:56.687 に答える
1

XML エンティティは DOM で抽象化されます。コンテンツは、エンコーディングを気にする必要なく String で公開されます。ほとんどの場合、エンコーディングは必要です。

しかし、SAX はエンティティの処理方法をある程度サポートしています。XMLReaderカスタムでを作成しEntityResolver#resolveEntityて、パラメータとして に渡すことができますSAXReader。しかし、うまくいかないかもしれません:

パーサーは、最上位ドキュメント エンティティ (外部 DTD サブセット、DTD 内で参照される外部エンティティ、およびドキュメント要素内で参照される外部エンティティを含む) を除く外部エンティティを開く前に、このメソッドを呼び出します。

LexicalHandlerそれ以外の場合は、エンティティが検出されたときに通知されるように SAX 用に構成しようとすることができます。Javadoc forLexicalHandler#startEntityは次のように述べています。

一部の内部および外部 XML エンティティの開始を報告します。

解像度を変更することはできませんが、それでも役立つ場合があります。

編集

dom4j が提供するSAXReaderおよびを使用して XML を読み書きする必要があります。XML ファイルの読み取りと XML ファイル書き込みXMLWriterを参照してください。ファイルを自分で使用したりダンプしたりしないでください。asXml()

FileOutputStream fos = new FileOutputStream("simple.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
writer.flush();
于 2010-02-12T13:35:04.420 に答える
0

入力ストリームを前処理し&て egに置き換え[$AMPERSAND_CHARACTER$]、次に dom4j で処理し、出力ストリームを後処理して逆置換を行うことができます。

例 ( streamflyerを使用):

import com.github.rwitzel.streamflyer.util.ModifyingReaderFactory;
import com.github.rwitzel.streamflyer.util.ModifyingWriterFactory;

// Pre-process
Reader originalReader = new InputStreamReader(myInputStream, "utf-8");
Reader modifyingReader = new ModifyingReaderFactory().createRegexModifyingReader(originalReader, "&", "[\\$AMPERSAND_CHARACTER\\$]");

// Read and modify XML via dom4j
SAXReader xmlReader = new SAXReader();
Document xmlDocument = xmlReader.read(modifyingReader);
// ...

// Post-process
Writer originalWriter = new OutputStreamWriter(myOutputStream, "utf-8");
Writer modifyingWriter = new ModifyingWriterFactory().createRegexModifyingWriter(originalWriter, "\\[\\$AMPERSAND_CHARACTER\\$\\]", "&");

// Write to output stream
OutputFormat xmlOutputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(modifyingWriter, xmlOutputFormat);
xmlWriter.write(xmlDocument);
xmlWriter.close();

前処理と後処理にFilterInputStream / FilterOutputStreamPipedInputStream / PipedOutputStream、またはProxyInputStream / ProxyOutputStreamを使用することもできます。

于 2016-11-08T13:42:10.227 に答える