このattr1 = "value" attr2バグでJAXBがXMLタグを受け入れる簡単な方法はありますか?
いいえ、これはバグではありません。
attr1="value"attr2
を含むXMLは整形式ではないため、JAXBは解析できず、致命的な回復不可能なエラーを示す例外がスローされます。
あなたはこの種のXMLっぽいデータを期待して、あなたはそれに対する制御(サードパーティからそれを受け取る)、 OKだあなたのソリューションを持っていない場合。しかし、もし私があなただったら私はこの第三者に連絡して、彼らに無効なXMLを吐き出していると言い、それはあまりプロフェッショナルではありません。
正規表現で文字列を置き換えるの代わりにこのようなものになる(ただし、これは正確に簡単ではありません)でした:
public String toWellFormed(String xml) throws IOException, SAXException {
StringBuilder sb = new StringBuilder(xml);
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(null);
reader.setErrorHandler(null);
boolean threw = true;
while (threw)
try {
reader.parse(new InputSource(new StringReader(sb.toString())));
threw = false;
} catch (SAXParseException ex) {
if (ex.getMessage().contains("must be followed by either attribute specifications")) {
threw = true;
int line = ex.getLineNumber();
int column = ex.getColumnNumber();
sb.insert(line * column - 1, ' ');
} else
throw ex;
}
return sb.toString();
}
String malformedXml = "<test a='a'b='b'c='c'/>";
String wellFormedXml = toWellFormed(malformedXml);
"<test a='a'b='b'c='c'/>".equals(wellFormedXml);
JAXBのUnmarshaller
は、処理後wellFormedXml
を処理することができるはずです。
データに検索対象物があまり多くなく、記載されている特定の書式設定エラーのみが含まれているため、正規表現を使用してデータを置き換えるのが十分であれば、もちろん私のソリューションは使用しないでくださいより多くの書式設定エラーが予想される場合は、このようなものを使用することができます。
通知者のエラーとコンテンツハンドラを明示的にnull
に設定していることに注意してください。これは、不正な形式のXMLが与えられても、決して呼び出されないからです。リーダは早期に失敗します。これは、致命的な回復不可能なエラーであるためです。これはもちろん、私たちにとって非常に悪いことです。文書に記述したような10のエラーが含まれていると、すべてのエラーが見つかるまで、私のメソッドはXMLを10回解析します。私は、JDKのXMLパーサーを認識していないので、フォーマットエラーを報告し、解析中(プロセス中のすべてのエラーを報告)します。あなたは優雅に警告やエラーを処理でき、適切ErrorHandler
を使用して
は、しかし致命的なエラーがさえErrorHandler
(そのfatalError
メソッドの後に処理が停止し、呼び出される)で処理することができませんでした。あなたは、単に、あなたが前と同じ問題に直面するデリゲートXMLReader
への呼び出しのすべてを転送するデフォルトXMLFilterImpl
クラスを使用している場合ので、どちらかのお手伝いをしていないだろうXMLFilter
実装を使用して
:最初のエラーで、処理停止します。実際には、何かを実装したい場合は、XMLFilter
に直接XMLFilter
のインタフェースを実装してください(私に尋ねれば、setParent
とgetParent
メソッドは悪い設計です)。しかし、不正なXMLを解析できるXMLReader
を実装することはおそらく面倒です。
私は答えとしてこれを受け入れます私の現在のものよりも回避策です。現在のストリームには複数のXMLドキュメントが含まれているため、私はそれを使用しませんが、JAXBが適切に処理するようにそれらを分割するカスタムフィルタが既にありますので、行番号と列番号が間違っています。さらに、このバグを含む複数のExceptionType要素が存在する可能性があります。これらの要素をすべて修正するループが必要となります。これは、すべてのマッチをただちに置換するのと比べてパフォーマンスが大幅に向上します。ありがとう! –