2011-12-16 12 views
0

スペースなし属性"1503"とoutcomeTypeのスペースはありません)。XMLは、私は(Webサービスで使用される)次のスキーマのためのクラスを作成するためにJAXBを使用している

今のところ、を<Exception errorCode="\1" outcomeTypeに置き換えて、XMLレスポンス全体でJAXB unmarshallerに渡しても動作しますが、他のXMLレスポンスにこの「バグ」があるかどうかは疑問です。
このattr1="value"attr2バグでJAXBがXMLタグを受け入れる簡単な方法はありますか?または、カスタムXMLFilterImplを使用していますか?

答えて

3

この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のインタフェースを実装してください(私に尋ねれば、setParentgetParentメソッドは悪い設計です)。しかし、不正なXMLを解析できるXMLReaderを実装することはおそらく面倒です。

+0

私は答えとしてこれを受け入れます私の現在のものよりも回避策です。現在のストリームには複数のXMLドキュメントが含まれているため、私はそれを使用しませんが、JAXBが適切に処理するようにそれらを分割するカスタムフィルタが既にありますので、行番号と列番号が間違っています。さらに、このバグを含む複数のExceptionType要素が存在する可能性があります。これらの要素をすべて修正するループが必要となります。これは、すべてのマッチをただちに置換するのと比べてパフォーマンスが大幅に向上します。ありがとう! –

1

これは無効なxml(attr値と次のattrの間にスペースがない)であり、パーサーは常に失敗します。私はあなたが現在やっているやり方でそれを管理しなければならないと思っています。

+0

このようなバグを修正することに感謝していたように、ソースを修正するのが最初の試みでしたが、彼らはそれを認めず、修正する前に解析する必要がありました。私はこれがやや一般的で、いくつかの回避策をオンラインで見つけることを望んでいましたが、何もありません。 –

0

まあ、JAXBはXMLの制約にちょうど従っています。スペースがない場合は、検証されません。おそらく、検証をオフにする?それはそれを介して動作する可能性があります。

+1

バリデーションに関連すると思われません。ここでは問題のある不正なXMLです。 – Nrj

関連する問題