Dưới đây là một XSD:Sử dụng XSD với bao gồm
<?xml version="1.0"?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
>
<xsd:simpleType name='TheSimpleType'>
<xsd:restriction base='xsd:string' />
</xsd:simpleType>
</xsd:schema>
Đây là một XSD thứ hai bao gồm một ở trên:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
targetNamespace='a'
xmlns='a'
>
<xsd:include schemaLocation='Include.xsd' />
<xsd:element name = "TheElement" >
<xsd:complexType>
<xsd:attribute name="Code" type="TheSimpleType" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
tôi cần phải đọc (thứ hai) XSD vào C# và:
- kiểm tra xem đó có phải là XSD hợp lệ và
- xác thực tài liệu chống lại nó.
Dưới đây là một số C# để đọc trong lược đồ:
XmlSchemaSet schemaSet = new XmlSchemaSet();
foreach (string sd in Schemas)
{
using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open)))
{
schemaSet.Add(XmlSchema.Read(r, null));
}
}
schemaSet.CompilationSettings = new XmlSchemaCompilationSettings();
schemaSet.Compile();
Các .Compile() không thành công vì "Type. 'A: TheSimpleType' không được công bố, hoặc không phải là một kiểu đơn giản"
Tuy nhiên, nó hoạt động nếu một trong hai:
- không gian tên được lấy ra từ các lược đồ, hoặc
- không gian tên được thêm vào bao gồm.
Câu hỏi đặt ra là: làm thế nào để C# chấp nhận nó mà không cần chỉnh sửa sơ đồ?
Tôi nghi ngờ vấn đề là mặc dù tôi đã đặt cả hai sơ đồ vào XmlSchemaSet, tôi vẫn cần phải nói với C# rằng một được bao gồm trong khác, tức là, nó đã không làm việc nó ra cho chính nó. Thật vậy, nếu tôi chỉ nói cho XmlSchemaSet về XSD chính (và không bao gồm) (cả hai không có các không gian tên()) thì "Type 'TheSimpleType' không được khai báo, hoặc không phải là một kiểu đơn giản."
Vì vậy, điều này dường như là một câu hỏi về giải quyết bao gồm: làm thế nào ?!
+1 chưa bao giờ biết về lớp 'XmlSchemaInclude'. Câu trả lời chính xác. – psubsee2003
OK, tốt. Nhưng bây giờ giả sử rằng tôi phải xác định tất cả các tính năng bao gồm trong thời gian chạy, tức là, tôi cung cấp cho bạn một XSD tùy ý kèm theo và bạn phải truy cập và tìm nạp tất cả chúng. –
's = XmlSchema.Read (r, null);' Bây giờ tôi thấy chúng ta có 's.Includes' là các đối tượng' XmlSchemaInclude', và nó được điền chính xác (với 1 bao gồm). –