Tenho este XSD de exemplo. Ele funciona, mas quando ocorre um erro de validação, ele mostra o erro como mostrado abaixo. Quero o nome do campo também:
Erro de validação: O elemento 'FIELD' é inválido - O valor '12345' é inválido de acordo com seu tipo de dados 'Union' - O valor '12345' não é válido de acordo com nenhum dos memberTypes da união.
XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="DOCUMENTS">
<xs:complexType>
<xs:sequence>
<xs:element name="DOCUMENT">
<xs:complexType>
<xs:sequence>
<xs:element name="FORM" type="xs:string"/>
<xs:element name="HEADER">
<xs:complexType>
<xs:sequence>
<xs:element name="FIELD" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="FieldValueType">
<xs:attribute name="name" type="FieldNameType" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="TABLES" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="FieldNameType">
<xs:restriction base="xs:string">
<xs:enumeration value="CALC_FILE"/>
<xs:enumeration value="SQL_ORGNO"/>
<xs:enumeration value="SQL_RECEIVER"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FieldValueType">
<xs:union memberTypes="CALC_FILEType SQL_ORGNOType SQL_RECEIVERType"/>
</xs:simpleType>
<xs:simpleType name="CALC_FILEType">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z ]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SQL_RECEIVERType">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z ]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SQL_ORGNOType">
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XML
<?xml version="1.0" encoding="utf-8"?>
<DOCUMENTS>
<DOCUMENT>
<FORM>Development_template_DfD_1.8</FORM>
<HEADER>
<FIELD name="CALC_FILE">test</FIELD>
<FIELD name="SQL_ORGNO">12345</FIELD>
<FIELD name="SQL_RECEIVER">Test AS</FIELD>
</HEADER>
<TABLES />
</DOCUMENT>
</DOCUMENTS>
Se você validar uma árvore como uma
XmlDocument
e se aprofundar para obter umaXmlSchemaValidationException
da exceção de validação, você pode convertê-laSourceObject
para umaXmlNode
e ler suaOuterXml
(ou, claro, certos atributos, se necessário, por exemplo{((e.Exception as XmlSchemaValidationException).SourceObject as XmlNode).Attributes["name"].Value}
)):Para uma amostra inválida com, por exemplo
isso produz, por exemplo