次のような文字列があります。
<tag1><tag2>Text</tag2> > AnotherText</tag1>
XMLOutputFactoryImpl を使用してその XML を解析して文字列に変換していますが、単一の「より大きい」(AnotherText の直前) もエスケープする必要があります。
これを機能させるために OutputFactory をどのように構成する必要があるか考えていますか?
次のような文字列があります。
<tag1><tag2>Text</tag2> > AnotherText</tag1>
XMLOutputFactoryImpl を使用してその XML を解析して文字列に変換していますが、単一の「より大きい」(AnotherText の直前) もエスケープする必要があります。
これを機能させるために OutputFactory をどのように構成する必要があるか考えていますか?
問題を再現できません。これが私のコードです(私はrt.jarのデフォルトのStAXを使用しています):
XMLOutputFactory of = XMLOutputFactory.newInstance();
System.out.println(of.getClass());
XMLStreamWriter ow = of.createXMLStreamWriter(System.out);
ow.writeStartElement("tag1");
ow.writeStartElement("tag2");
ow.writeCharacters("Text");
ow.writeEndElement();
ow.writeCharacters("> AnotherText");
ow.writeEndElement();
ow.close();
出力
<tag1><tag2>Text</tag2>> AnotherText</tag1>
XML API (DOM、StAX、または JAXB) を使用している場合、コンテンツは自動的にエスケープされます。これには CDATA セクションを使用することもできます。
Apache Common lang ライブラリを使用して、文字列をエスケープできます。
org.apache.commons.lang.StringEscapeUtils
String escapedXml = StringEscapeUtils.escapeXml("the data might contain & or ! or % or ' or # etc");
更新された回答:
最善の解決策は、テキスト入力を生成するプログラムを修正することです。そのような最も簡単な修正には、他の回答が示唆するようなエスケープユーティリティが含まれます。それができない場合は、次のような正規表現を使用します
</?[a-zA-Z]+ */?>
予想されるタグに一致させ、文字列をタグ (変更せずに渡したい) とタグ間のテキスト (エスケープ メソッドを適用したい) に分割します。
あなたが扱っているのは有効な XML ではないので、XML パーサーがそれを実行できるとは期待していません。既存のエスケープの欠如が曖昧さを生み出す可能性があるため、完璧な仕事をすることもできないかもしれません.