2017-04-26 1 views
0

Visual Studio 2015를 사용하고 있습니다. 이름이 "firstName"인 요소에 대해 사과드립니다. "fullName"이어야하지만, 이미 스키마에 대한 클래스를 생성했기 때문에 이것은 내 자신의 학습을위한 것일뿐입니다.C# Desisializing 및 XmlReader.Create를 사용하여 XSD에 대해 XML 파일 유효성 검사가 작동하지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="address-schema" 
targetNamespace="http://tempuri.org/address-schema.xsd" 
elementFormDefault="qualified" 
attributeFormDefault="qualified" 
xmlns:addr="http://tempuri.org/address-schema.xsd" 
xmlns:mstns="http://tempuri.org/address-schema.xsd" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="address"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="firstName"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="first" type="addr:nameComponent"/> 
       <xs:element name="middle" type="addr:nameComponent" minOccurs="0"/> 
       <xs:element name="last" type="addr:nameComponent"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="nameComponent"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"/> 
    </xs:simpleContent> 
    </xs:complexType> 

</xs:schema> 

내가 스키마에 부합 생각하는 XML 파일 : 내가 XML의 여기 스키마가

<?xml version="1.0" encoding="utf-8" ?> 
<addr:address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://tempuri.org/address-schema.xsd address-schema.xsd" 
      xmlns:addr="http://tempuri.org/address-schema.xsd"> 
    <addr:firstName> 
    <addr:first>Some</addr:first> 
    <addr:middle>Bodys</addr:middle> 
    <addr:last>Name</addr:last> 
    </addr:firstName> 
</addr:address> 

그리고 여기에 XML의 유효성을 확인하는 것입니다 시도하는 코드를합니다 (참고 XML 파일로 직렬화지고있다 "주소"클래스가 xsd.exe에서 자동 생성 된 클래스)입니다 :

address address; 
var xmlSchemaSerializer = new XmlSerializer(typeof(XmlSchema)); 
var addressXmlSerializer = new XmlSerializer(typeof(address)); 

var schemas = new XmlSchemaSet(); 
XmlSchema schema; 
using (var xsdStream = File.OpenRead("address-schema.xsd")) 
{ 
    schema = (XmlSchema)xmlSchemaSerializer.Deserialize(xsdStream); 
} 
schemas.Add(schema); 
var settings = new XmlReaderSettings 
{ 
    Schemas = schemas, 
    ValidationType = ValidationType.Schema, 
    ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation 
}; 
settings.ValidationEventHandler += (sender, arguments) => 
{ 
    throw new XmlSchemaValidationException(arguments.Message); 
}; 

using(Stream addressXmlStream = File.OpenRead("address-doc.xml")) 
using (XmlReader reader = XmlReader.Create(addressXmlStream, settings)) 
{ 
    address = (address)addressXmlSerializer.Deserialize(reader); 
} 
Console.WriteLine(address.firstName.first.Value == "Some" ? "Success!" : "Fail"); 
Console.ReadKey(); 

예외 ('System.Xml.Schema.XmlSchemaValidationException'The GLO bal 요소 'http://tempuri.org/address-schema.xsd:address'은 이미 선언되었습니다.) ValidationEventHandler에 throw됩니다. 도움이나 제안을 보내 주시면 감사하겠습니다. 미리 감사드립니다!

답변

0

예외의 원인은 문서에 스키마를로드하는 스키마 위치 힌트가 있지만 사용자가 이미로드했기 때문입니다.

스키마에서 미리로드하거나 문서에서 xsi:schemaLocation 특성을 제거하지 마십시오.

+0

도움을 주셔서 감사합니다! 즉, XML 파일에서 xsi : schemaLocation 특성을 사용하면 Schemas.Add를 사용하여 스키마를 추가해서는 안됩니다. XmlReaderSettings? 따라서 xsi : noSchemaLocation 특성을 사용하면 XML 유효성을 검사하기 위해 스키마를 XmlReaderSettings에 추가해야합니다. –

관련 문제