C# 删除不针对XSD进行验证的XML
我有一个XML和XSD 我遇到的问题是,如果一个元素\属性在上载过程中失败,则不会上载任何内容。因此,使用XSD,我想在上传之前去掉所有无效的“行” 如果以以下内容为例:C# 删除不针对XSD进行验证的XML,c#,xml,xsd,C#,Xml,Xsd,我有一个XML和XSD 我遇到的问题是,如果一个元素\属性在上载过程中失败,则不会上载任何内容。因此,使用XSD,我想在上传之前去掉所有无效的“行” 如果以以下内容为例: 但是它只删除第一个错误部分,如果以后有错误部分,SchemaInfo.Validity值是未知的我认为唯一的方法是使用您自己的代码手动验证XML 由于XSD的可能结构和可能发生的错误,创建一个能够始终跳过错误并继续的验证器将非常困难,因此我所知道的任何解析器都没有这样做 在某些情况下,他们会在出错后继续验证,但通常会忽略初始
但是它只删除第一个错误部分,如果以后有错误部分,SchemaInfo.Validity值是未知的我认为唯一的方法是使用您自己的代码手动验证XML 由于XSD的可能结构和可能发生的错误,创建一个能够始终跳过错误并继续的验证器将非常困难,因此我所知道的任何解析器都没有这样做 在某些情况下,他们会在出错后继续验证,但通常会忽略初始错误后的所有同级,以便返回到更一致的状态。基本上,一旦遇到错误,通常会出现多个验证路径,因为验证状态变得不明确 这就是说,如果您的数据与示例中的数据一致,并且您对XSD有一定的控制权,那么您可以将的XSD定义重构为根元素,然后在需要的地方使用元素引用。然后可以一次加载每个元素,并在运行时验证每个元素。这样,读取文档的代码将与每个文档的验证断开连接,因此,如果其中一个文档无效,您将丢弃它并转到下一个文档 注意:这种方法意味着XML文档的其余部分没有经过验证
<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>
foreach (XmlElement row in doc.SelectNodes("TableName/Row"))
{
if (row.SchemaInfo.Validity == XmlSchemaValidity.Invalid)
{
row.ParentNode.RemoveChild(row);
}
}