2015-09-25 65 views
2

我正在測試從.NET版本4.5.1切換到4.6並在對可選屬性使用唯一約束時在xsd驗證中遇到了NullReferenceException。使用.NET 4.6驗證xml時出現NullReferenceException

at System.Xml.Schema.KeySequence.ToString() 
at System.Xml.Schema.XmlSchemaValidator.EndElementIdentityConstraints(Object typedValue, String stringValue, XmlSchemaDatatype datatype) 
at System.Xml.Schema.XmlSchemaValidator.InternalValidateEndElement(XmlSchemaInfo schemaInfo, Object typedValue) 
at System.Xml.XsdValidatingReader.ProcessEndElementEvent() 
at System.Xml.XsdValidatingReader.ProcessElementEvent() 
at System.Xml.XsdValidatingReader.ProcessReaderEvent() 
at System.Xml.XsdValidatingReader.Read() 
at ConsoleApplication.Program.Main(String[] args) 

這其中靶向v4.5.x時運行,但使用4.6時失敗,一個NullReferenceException被剝離的代碼。 (使用VS2013和VS2015在Win7上測試)。這是合法的XML?即使不是,它應該引發一些XmlException。

模式:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Enumerations"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Enum" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:attribute name="id" type="xs:string" use="optional"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="unique_EnumId_contraint"> 
     <xs:selector xpath="Enum"/> 
     <xs:field xpath="@id"/> 
    </xs:unique> 
    </xs:element> 
</xs:schema> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<Enumerations> 
    <Enum /> 
    <Enum /> 
</Enumerations> 

C#代碼:

var settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.Schema; 
settings.Schemas.Add(null, "enumerations.xsd"); 

using (var xmlReader = XmlReader.Create("enumerations.xml", settings)) 
{ 
    while (xmlReader.Read()) 
    { 
     if (xmlReader.NodeType == XmlNodeType.Element) 
     { 
      Console.CursorLeft = xmlReader.Depth * 4; 
      Console.WriteLine(xmlReader.Name); 
     } 
    } 
} 
+0

看起來不像Enum節點有id的 –

+0

這是爲了保持與先前格式的向後兼容性。我可以檢查代碼中的唯一性,但它應該像4.5.x – Pat

回答

1

我可以重現這個。看起來像一個bug(<rant> .NET 4.6有很多... </rant>)。您應該將其報告給Microsoft Connect

雖然這是固定的,您可以點擊這裏來源:http://referencesource.microsoft.com/#System.Xml/System/Xml/Schema/ConstraintStruct.cs,091791a9542f1952

它告訴我們的是它可以使用AppContext開關來克服,所以在任何其他只需添加以下代碼,它會工作:

AppContext.SetSwitch("Switch.System.Xml.IgnoreEmptyKeySequences", true); 

更多此開關可以在這裏找到:Mitigation: XML Schema Validation - 注意了一句:「這種變化的影響應該很小」 :-)

PS:我相信你也可以改變這些開關ü唱合適的.config文件。

+0

中那樣工作。謝謝。我不知道MS仍在改變XML解析。另一個問題針對另一個框架版本在我的情況下運行相同的代碼是否與此交換機的另一個默認值相同或舊代碼是否被執行? – Pat

+0

不,它仍然是.NET 4.6,但它需要另一條路徑(也許是舊的代碼路徑,也許不是)。 –

+0

https://connect.microsoft.com/VisualStudio/feedback/details/1843927 – Pat

相關問題