显示可能的有效xml元素值列表

时间:2014-10-07 14:49:34

标签: xml xsd

我有以下Xml架构。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Type 1" />
      <xs:enumeration value="Type 2" />
      <xs:enumeration value="Type 3" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Element_1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="TypeName" type="type" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Element_2">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="TypeName" type="type" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我正在针对上述架构验证xml。

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Element_1>
        <TypeName>Type 4</TypeName>
    </Element_1>
    <Element_3>
        <TypeName>Type 2</TypeName>
    </Element_3>
</Root>

我期待验证错误,我得到一个: 'TypeName'元素无效 - 值'Type 4'根据其数据类型'type'无效 - Enumeration约束失败。 元素“Root”具有无效的子元素“Element_3”。预期可能元素的列表:'Element_2'。

错误消息清楚地显示了无效元素(Element_3),并且还显示了可能的有效元素列表(Element_2)。是否可以显示'TypeName'的有效列表。

现在,我想要类似于下面的错误消息: 'TypeName'元素无效 - 值'Type 4'根据其数据类型'type'无效。 预期的可能值列表:'类型1,类型2' - 枚举约束失败。 元素“Root”具有无效的子元素“Element_3”。预期可能元素的列表:'Element_2'。

是否有可能获得上述错误消息(或类似)。 xs:enumeration以外的任何其他限制是否显示所有有效值?

1 个答案:

答案 0 :(得分:0)

@Richard:谢谢您的信息。

找不到解决方案,但建立了一种解决方法。

private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
    if (e.Exception != null && e.Exception.InnerException != null)
    {
        if (e.Exception.InnerException.Message == "The Enumeration constraint failed.")
        {
            if (((XElement)sender).Name == "TypeName")
            {
                Console.WriteLine("Error, valid Enums are Type 1, Type 2, Type 3...");
            }
        }
    }
    else
    {
        Console.WriteLine("Error.");
    }
}