在validationXML时inputcatch

目前正在为一家税务公司工作,试图将广泛的Excel文档parsing为XML代码。 没有什么印象 问题在于用于validationparsing的XML代码的XSD架构的开发人员。

这是事情变得疯狂的地方。 在整个XSD中都注意到了编程效率的明显差异,至less有两个不同的开发者参与其中(第二个是法语,因为他用英文名称换成了法文…)。 现在的问题。 这两个开发人员喜欢使用自己的结构来制作XSD架构,其中一个使用1的&0来validationcheckbox,另一个使用选中和未选中。 非常方便,因为所有的variables都是字母C + 4的组合。

所以这里终于来了这个问题! 由于我使用Interop将Excel中的所有内容parsing为2列表,因此所有空值都logging为“”。 这包括空的checkbox,空string,空date。

在XDocument结构中实现之前,是否有可能检查节点的types? 通过这种方式,我可以检查传入节点是否来自checkboxtypes,并确保它的处理“未检查”string,而不是一个空string不会validation。

我的另一个解决scheme是硬编码每一个checkboxtypes的代码,每次运行比较。

显示我们正在谈论的xsd的一些代码..:

<xs:element name="c1001" type="checkboxType" minOccurs="0"/> <xs:element name="c1002" type="checkboxType" minOccurs="0"/> <xs:element name="c1062" type="checkboxType" minOccurs="0"/> <xs:element name="c1028" type="checkboxType" minOccurs="0"/>> <xs:element name="c1035" type="numeric2Type" minOccurs="0"/> <xs:element name="c1054" type="numeric2Type" minOccurs="0"/> <xs:element name="c1055" type="numeric2Type" minOccurs="0"/> <xs:element name="c1036" type="numeric2Type" minOccurs="0"/> <xs:element name="c1037" type="numeric2Type" minOccurs="0"/> <xs:element name="c1058" type="numeric2Type" minOccurs="0"/> <xs:element name="c1059" type="numeric2Type" minOccurs="0"/> <xs:element name="c1043" type="numeric2Type" minOccurs="0"/> <xs:element name="c1044" type="numeric2Type" minOccurs="0"/> <xs:element name="c1032" type="numeric2Type" minOccurs="0"/> <xs:element name="c1033" type="numeric2Type" minOccurs="0"/> <xs:element name="c1100" type="numericu8D2Type" minOccurs="0"/> 

我试图parsing的一些代码:

 <c1002>checked</c1002> <c1250> <valeur>227967.29</valeur> </c1250> <c1254>345.70</c1254> <c1255>345.70</c1255> <c1285>17410.44</c1285> <c1286> <valeur>92583.46</valeur> </c1286> <c1287>731.28</c1287> 

validation通过以下代码处理:

  if (!IsValidXmlEx(nParsed,@"E:\Work\Resources\xsds\declaration_inr.xsd")) MessageBox.Show(Errors); else MessageBox.Show("Success"); public bool IsValidXmlEx(XDocument xmlDoc, string strXsdLocation) { bool bStatus = false; try { // Declare local objects XmlReaderSettings rs = new XmlReaderSettings(); rs.ValidationType = ValidationType.Schema; rs.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation | XmlSchemaValidationFlags.ReportValidationWarnings; rs.ValidationEventHandler += new ValidationEventHandler(rs_ValidationEventHandler); rs.Schemas.Add(null, XmlReader.Create(strXsdLocation)); using (XmlReader xmlValidatingReader = XmlReader.Create(xmlDoc.CreateReader(), rs)) { while (xmlValidatingReader.Read()) { } } ////Exception if error. if (nErrors > 0) { throw new Exception(strErrorMsg); } else { bStatus = true; }//Success } catch (Exception error) { bStatus = false; } return bStatus; } void rs_ValidationEventHandler(object sender, ValidationEventArgs e) { if (e.Severity == XmlSeverityType.Warning) strErrorMsg += "WARNING: " + Environment.NewLine; else strErrorMsg += "ERROR: " + Environment.NewLine; nErrors++; strErrorMsg = strErrorMsg + e.Exception.Message + "\r\n"; } 

它看起来像从Excel获得的XML对模式来说是完全无效的。 它看起来像Excel将所有导出的值视为stringtypes。

如果这是发生的事情,那么我会build议,真的没有什么好方法来处理这个问题。 您或者需要:

  1. 更新您的Excel导出,以便它输出有效的XML(关于模式)。
  2. 将您的Excel输出转换为另一个XML实例,然后可以根据模式进行validation(可能使用xslt)或
  3. 用代码或其他方式进行validation,或者
  4. 根本不validation输出。

无论如何,我并不知道允许非有效的XML根据XSD进行validation的“窍门”。

对不起,这可能不是你正在寻找的答案。

UPDATE

OK – 一个XSD模式描述了XML文档的外观。 它定义了该文件中合法的types。 任何针对XSD模式validation的XML文档都可以说是该模式的“模式实例”。

在你的情况下,XSD定义了一个字段types(c1035,c1036等),以及它们的types。 上面的架构示例中的每个types都是自定义types,应该在XSD中的其他位置定义。

然而,“模式实例”,在你的情况下来自Excel的输出,不validation。

我们以XML输出为例:

 <c1002>checked</c1002> 

如果我们查看模式片段,我们可以看到以下内容:

 <xs:element name="c1001" type="checkboxType" minOccurs="0"/> 

这告诉我有一个名为checkboxType的types在模式中的某处定义。 这个types可以在同一个模式中内联,也可以在这个模式引用的另一个模式中定义。

现在, checkboxType可能已经被定义为任何模式实例文档的字段c1002中的数据的一组允许值,例如“checked”和“unchecked”。

如果字段中的值根据types定义不是“有效的”,则模式实例无效。

这就是当你对xml输出运行xsdvalidation时发生的情况,除了每一个字段。 在某处,根据XSD模式中定义的types定义,输出的数据不正确。

由于您没有提供任何错误消息,因此不可能确切知道这个失败的位置,但是根据您的评论,它在第一个50或60个字段之后。