2016-09-05 9 views
0

私が作業しているXMLファイルは作成されていないため無効です。未加工のXMLを事前処理します(Java)

  • 複数のXML宣言(エラーメッセージ:これは、以下の問題提示する。処理命令目標マッチング "[XX] [mm]の[LLが" 許可されていないをルート要素の
  • 不在を(エラーメッセージ:文書の終わりに追加コンテンツ)

    ファイルは複数のレコードを含み、これは、2つのレコードを抜粋である:

よく形成され、有効であるためには
<?xml version="1.0" encoding="utf-8"?> 
<ElementAa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some-namespace"> 
    <ElementBa attributeB1="11111" attributeB2="someDate"> 
    <ElementCa attributeC1="someString" attributeC2="someOtherDate"> 
     <ElementDa attributeD1="12345" /> 
    </ElementCa> 
    <ElementEa attributeE1="ABCD" /> 
    </ElementBa> 
</ElementAa> 
<?xml version="1.0" encoding="utf-8"?> 
<ElementAb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some-namespace"> 
    <ElementBb attributeB1="22222" attributeB2="AgainDate"> 
    <ElementCb attributeC1="anotherString" attributeC2="yetAnotherDate"> 
     <ElementDb attributeD1="67891" /> 
    </ElementCb> 
    <ElementEb attributeE1="EFGHI" /> 
    </ElementBb> 
</ElementAb> 

、上記文書は(私が間違っているなら、私を修正してください)このになってする必要があります。

<?xml version="1.0" encoding="utf-8"?> 
<ElementAa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some-namespace"> 
<ElementBa attributeB1="11111" attributeB2="someDate"> 
    <ElementCa attributeC1="someString" attributeC2="someOtherDate"> 
     <ElementDa attributeD1="12345"/> 
    </ElementCa> 
    <ElementEa attributeE1="ABCD"/> 
</ElementBa> 
<ElementBb attributeB1="22222" attributeB2="AgainDate"> 
    <ElementCb attributeC1="anotherString" attributeC2="yetAnotherDate"> 
     <ElementDb attributeD1="67891"/> 
    </ElementCb> 
    <ElementEb attributeE1="EFGHI"/> 
</ElementBb> 
</ElementAa> 

私はそれを認識していますが、データが高品質でなければならないすべての可能な世界の中で最高のものですが、残念ながら私は貧弱なデータセットに対処しなければならず、整形式で有効なXMLを達成するための良いアプローチを見つけようとしています。現時点では、すべてのXML宣言(正規表現にはPattern/Matcherを使用)を削除し、ファイルの先頭に必要なものだけを挿入するユーティリティメソッドを2つ作成しました。のみ保持する<ElementAa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some-namespace">

私はこのアプローチが特に理想的ではないと思うし、大きなファイルを扱うときには非常に問題になると思います。どんな勧告、示唆、潜在的なアプローチも大いに評価されるだろう!私は実際に説明されたシナリオの良いアプローチを探しています。

は、どうもありがとうございます

I.

EDIT 1:述べたように 、XMLコンテンツは、.txtファイルと私が使用共通BufferedReaderのを読んで書いた2つのユーティリティメソッド内にありますその内容。私はすべての "データクリーニング"を行う前に.xml拡張子のファイル名を変更する(私はそれを行う別のユーティリティを持っている)とJaxBパーサーにフィードします。

EDIT 2:残念ながら、私はFTPから直接ファイルを読み込むため、XML生成を制御できません。私が抜粋を提供した結果のXMLに複数のXMLをどのように連結するかを制御するのは良いことですが、不可能です。

+1

推奨:ファイルを作成したコードを変更して、有効なXMLファイルを作成してください。または、複数のXMLファイルを1つに連結しないように変更しますが、ファイルシステム上の個別のファイルとして、またはzipファイル内の個別のエントリとして、別々にしておきます。 2番目のオプションは、ファイルをまとめて保存したり、ダウンロードしたりする場合に特に適しています。 – Andreas

+0

@アンドレアス、私はそれをすることはできません、私は恐れています。 「XML」ファイル(縦型のカンマは整形式ではないために生成されているため)がどのように生成されるかについて私はコントロールできません。私はそれがむしろ迷惑であることを知っていますが、私はあなたが正しく悪いデータと呼ぶものを迂回する可能性のある手段を模索しています。 – paranza

+1

次に、それらを連結解除することをお勧めします。 '<?xml' XML宣言をスキャンし、その直前で分割し、各部分を別々に解析します。 – Andreas

答えて

1

基本的には、XMLの文法にいくつかの類似点を持つ文法のパーサーを書くことです。文法のパーサを書く前に、その文法が何であるかを定義する必要があります。つまり、XMLの文法のバリエーションの観点から、ツールが受け入れる入力を指定します。

標準化の目的は、誰もが同じ文法と同じパーサを使用できるようにコストを削減することです。また、人々が独自のバリエーションを使用すると、人生は誰にとってもより複雑になります。

これまでのところ、逸脱したXMLの文法を推測するために、1つの例を示します。まあ、例は仕様を作っていない。より真剣に、より多くの例を扱うためにそれを継続的に拡張することによって指定されていない言語のパーサを書くことは、うまくいきません。シジパスはあなたがする前に仕事を終えるでしょう。

また、他人のゴミを拾っている方が良いほど、ゴミが多くなります。

補遺

実際には、あなたの入力の文法は、実際にかなり容易に特定することができ、あなたの入力ファイルが単一のファイルに連結整形式XML文書のシーケンスが含まれている場合であれば。文書の先頭にXML宣言が必須である修正とおそらく

file ::= document+ 

:それはXML仕様に追加ただ1つの余分のルールです。

したがって、受け入れる文法を定義することはあまり難しくありません。しかし、この文法を正確に受け入れるパーサを書くことはまだ難しいことです。一番きれいな方法は、おそらくオープンソースのXMLパーサーを使ってそれを変更することです。

この文法を正規表現で解析する方法はありません。これは通常の言語ではありません(これが意味することを理解していない場合、パーサーを書くべきではありませんが、本質的には文法の定義再帰的です)。

しかし、あなたが使用できるいくつかのテクニックがあります。すべての文書は<?xmlで始まり、唯一の場所は(a)文書の始めに、(b)はコメントに、(c)はCDATAセクションにあります。コメントやCDATAセクションは入れ子にすることはできませんので、私はそれはあなたの言語のすべてのインスタンスは、シンプルな文法に準拠しますケースだと思う:

(`<?xml` (stuff | cdata | comment)*)* 

stuffは何として定義されて<?xml<![CDATA[、または含まれていません。 <!--)、cdataとcommentはXMLで定義されています。

この単純な(再帰的ではない)文法で文書を解析するだけで、文書の境界を特定し、各文書を通常のXMLパーサーに渡すことができます。

関連する問題