删除未针对XSD验证的XML

时间:2017-01-18 11:01:07

标签: c# xml xsd

我有一个XML和XSD。

我遇到的问题是,如果在上传过程中一个元素\属性失败,则不会上传任何内容。因此,使用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行和第4行中的Column2无效。因此,我想从XML中删除它。

我试过

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

但它只删除了第一个错误部分,如果以后出现错误,则SchemaInfo.Validity值为&#34; NotKnown&#34;

1 个答案:

答案 0 :(得分:0)

我认为唯一的方法是使用您自己的代码手动验证XML。

由于XSD的可能的结构和可能发生的可能的错误,创建一个可以一致跳过错误并继续的验证器,非常困难(因此不是我所知道的任何解析器所做的事情)。

在某些情况下,他们会在出错后继续验证,但通常他们会在初始错误后忽略所有兄弟姐妹(为了回到更一致的状态)。基本上一旦遇到错误,通常会有多个验证路径,因为验证状态变得模棱两可。

如果您的数据与样本一致,并且您可以控制XSD,则可以重构&lt; row&gt;的XSD定义。成为根元素(然后在需要的地方使用元素ref)。然后,您可以加载每个&lt; row&gt;元素一,一次验证每个元素。这样,读取文档的代码与每个&lt; row&gt;的验证断开连接,因此如果一个无效,则丢弃它并移动到下一个。

注意:这种方法意味着XML文档的其余部分未经过验证。