私は、XMLファイルを読み取るJavaプログラムを作成しています。実際には、XMLplist形式のiTunesライブラリです。を含むテキストに遭遇した場合を除いて、この形式が投げかけるほとんどの障害をなんとか回避することができました&
。XLMファイルは、このアンパサンドを次のように表します。テキストの特定のセクションに&
続くテキストを読み取ることしかできません。&
エスケープコードの検出を無効にする方法はありますか?SAXParserを使用しています。
私は、XMLファイルを読み取るJavaプログラムを作成しています。実際には、XMLplist形式のiTunesライブラリです。を含むテキストに遭遇した場合を除いて、この形式が投げかけるほとんどの障害をなんとか回避することができました&
。XLMファイルは、このアンパサンドを次のように表します。テキストの特定のセクションに&
続くテキストを読み取ることしかできません。&
エスケープコードの検出を無効にする方法はありますか?SAXParserを使用しています。
抜粋はありますか?ファイルはiTunesで生成されていますか?もしそうなら、それは私にはiTunesのバグのように聞こえます、それはアンパサンドを正しくエンコードするのを忘れていました。私は驚かないでしょう。彼らは明らかに最初からXMLを取得していませんでした。彼らのスキーマは<name>[key]</name><string>[value]</string>
、XMLの発明者を怒らせなければなりません。
別の、より堅牢なパーサーを使用することをお勧めします。SAXは、ファイルが整形式である限り優れています。ただし、dom4jとjdomがどれほど堅牢かはわかりません。試してみてください。Pythonの場合、私は推奨するElementTree
かBeautifulSoup
、非常に堅牢であることを知っています。
また、stackoverflowでここに記載されているhttp://code.google.com/p/xmlwise/もご覧ください(検索を使用しましたか?)。
更新:(更新された質問に従って)XML、つまりSAXでのエンティティの役割を理解する必要があります。デフォルトでは、テキストノードと同じように個別のノードです。したがって、完全な値を取得するには、隣接するテキストノードとそれらを結合する必要があります。パーサーでDTDを使用していますか?&
適切なDTDを(エンティティ定義とともに)使用すると、エンティティが表す文字などへのエンティティからのマッピングを含める&
ことができ、パーサーがマージを実行できる可能性があるため、多くの解析に役立ちます。(少なくとも、サブツリーをマテリアライズするときに、大きなファイルに使用するのが好きなpython XMLプルパーサーは使用します。)
これはおそらくエスケープ文字の最適な一般的な解決策ではありませんが、改行を考慮するだけでよかったので、\n だけを簡単に確認できました。
バックスラッシュ \ をチェックして、すべてのエスケープ文字をチェックするか、あなたの場合は & をチェックすることができますが、他の人にはよりエレガントなソリューションが付属していると思います。
@Override
public void characters(char[] ch, int start, int length)
{
String elementData = new String(ch, start, length);
boolean elementDataContainsNewLine = (elementData.indexOf("\n") != -1);
if (!elementDataContainsNewLine)
{
//do what you want if it is no new line
}
}
SAXParser を使用して以下の文字列を解析しています
<xml>
<FirstTag>&<</FirstTag>
<SecondTag>test</SecondTag>
</xml>
I want the same string to be retained but it is getting converted to below
<xml>
<FirstTag>&<</FirstTag>
<SecondTag>test</SecondTag>
<xml>
Here is my code. How can I avoid this being converted?
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
MyHandler handler = new MyHandler();
values = handler.getValues();
saxParser.parse(x, handler);