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됩니다. 도움이나 제안을 보내 주시면 감사하겠습니다. 미리 감사드립니다!
도움을 주셔서 감사합니다! 즉, XML 파일에서 xsi : schemaLocation 특성을 사용하면 Schemas.Add를 사용하여 스키마를 추가해서는 안됩니다. XmlReaderSettings? 따라서 xsi : noSchemaLocation 특성을 사용하면 XML 유효성을 검사하기 위해 스키마를 XmlReaderSettings에 추가해야합니다. –