2017-01-18 6 views
0

私はXMLとXSDを持っています。XSDに対して検証されないXMLを削除します

問題は、アップロード中に1つの要素\属性が失敗した場合、何もアップロードされないということです。したがって、XSDを使用して、アップロード前に無効な「行」を取り除きたいと思います。

以下は、例えば、上記の例では

<Row> 

    <Column1>1</Column1> 

    <Column2>2</Column2> 

</Row> 

<Row> 

    <Column1>1</Column1> 

    <Column2>2</Column2> 

</Row> 

<Row> 

    <Column1>1</Column1> 

    **<Column2>**B**</Column2>** 
</Row> 
<Row> 

    <Column1>1</Column1> 

    **<Column2>**C**</Column2>** 
</Row> 

とした場合、3行目に列2および4行目は無効です。したがって、私はXMLから両方を削除したいと思います。

私は

foreach (XmlElement row in doc.SelectNodes("TableName/Row")) 
      { 
       if (row.SchemaInfo.Validity == XmlSchemaValidity.Invalid) 
       { 
        row.ParentNode.RemoveChild(row); 
       } 
      } 

を試してみましたが、私はこれを行うための唯一の方法だと思い、それが唯一の最初のエラー・セクションを削除し、以降のエラーを持つセクションがある場合SchemaInfo.Validity値が「NotKnown」

答えて

0

です独自のコードを使用してXMLを手動で検証することです。一貫してエラーをスキップして続行することができますバリデータを作成するためXSDの可能構造とそれに発生する可能性が可能エラーに

は、非常に困難(したがってだろうと、そのものではありません私が知っているパーサーのいずれかが行った)。

状況によっては、エラーが発生した後も引き続き検証が行われますが、通常、最初のエラーの後ですべての兄弟を無視します(より一貫性のある状態に戻るため)。基本的にエラーが発生すると、検証状態があいまいになるため、複数の検証パスが使用されることがよくあります。

あなたのデータがサンプルの行に沿って何かであり、XSDを何らかのコントロールがあるとしたら、<行>のXSD定義をリファクタリングしてルート要素にすることができます(必要なところで要素refを使用します) 。その後、各<ローの>要素を一度に1つずつ読み込んで、それぞれを検証してください。そうすれば、文書を読み取るコードは<行>の妥当性検査から切り離されます。無効なものがあればそれを破棄し、次のものに移動します。

注:この方法は、残りのXMLドキュメントが検証されないことを意味します。

関連する問題