2014-10-07 42 views
0

我有以下Xml架構。顯示可能有效的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> 

我期待一個驗證錯誤,我得到一個: 的「類型名」元素是無效 - 未能枚舉約束 - 值「4型」根據其數據類型「類型」是無效的。 元素'Root'具有無效的子元素'Element_3'。預期可能的元素列表:'Element_2'。

錯誤消息清楚地顯示了無效元素(Element_3),並且還顯示可能的有效元素(Element_2)的列表。是否可以顯示'TypeName'的有效列表。

現在,我想要類似如下的錯誤消息: 'TypeName'元素無效 - 'Type 4'值根據其數據類型'type'無效。 預期的可能值列表:'類型1,類型2' - 枚舉約束失敗。 元素'Root'具有無效的子元素'Element_3'。預期可能的元素列表:'Element_2'。

是否有可能獲得上述錯誤信息(或類似)。除xs:enumeration以外的任何其他限制是否顯示所有有效值?

+1

? (沒有列出驗證錯誤報告的標準;每種工具都有其自己的方法。) – Richard 2014-10-07 14:54:27

+0

如果我理解正確,那麼您正在問我正在使用哪種工具。我正在使用Visual Studio 2012. – lerner1225 2014-10-08 07:23:46

+0

IIRC VS具有XML編輯和XSLT調試功能,但本身不是XSD驗證程序。 ISTR使用.NET XSD支持,它不允許您控制錯誤消息的輸出。您可以使用['System.Xml.Schema']中的類型(http://msdn.microsoft.com/zh-cn/library/system.xml.schema%28v=vs.110%29.aspx )名稱空間,但我不確定它們是否足夠詳細以便能夠獲得給定目標元素的可能值。我會感興趣的,看看你如何繼續... – Richard 2014-10-08 08:00:34

回答

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."); 
    } 
} 
什麼是您使用XML/XSD工具鏈
相關問題