Tôi đang sử dụng lược đồ XSD lồng nhau để xác thực hợp lệ tài liệu XML. Các XSD được nhập khẩu sử dụng các vùng tên đích của riêng chúng và tôi có thể xác thực XML mẫu được đưa ra dưới đây bằng cách sử dụng Liquid XML Studio. Nhưng khi tôi chạy xác thực bằng cách sử dụng mã C# của tôi dưới đây, nó không thành công với lỗi khai báo kiểu (xem bên dưới). Tôi có dành rất nhiều thời gian cố gắng tìm ra, nhưng không có may mắn:Lỗi xác thực XML bằng lược đồ XSD lồng nhau - Loại không được khai báo
chính XSD Schema (DataItem.xsd):
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" xmlns:DataYesNo="Doc.DataYesNo" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="DataNumeric.xsd" namespace="Doc.DataNumeric" />
<xs:import schemaLocation="DataYesNo.xsd" namespace="Doc.DataYesNo" />
<xs:complexType name="tDataItem">
<xs:choice>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
<xs:element name="DataYesNo" type="DataYesNo:tDataYesNo" />
</xs:choice>
</xs:complexType>
<xs:element name="DataItem" type="tDataItem" />
</xs:schema>
Bao gồm XSD Schema (DataNumeric.xsd):
**<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" elementFormDefault="qualified" targetNamespace="Doc.DataNumeric" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="tDataNumeric">
<xs:sequence>
<xs:element name="Answer" type="xs:double" />
</xs:sequence>
</xs:complexType>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
</xs:schema>**
XML:
<DataItem>
<DataNumeric xmlns:DataNumeric="Doc.DataNumeric">
<DataNumeric:Answer>37.8</DataNumeric:Answer>
</DataNumeric>
</DataItem>
Validation Lỗi:
XmlSchemaValidationException: Loại 'Doc.DataNumeric: tDataNumeric' không được công bố.
C# Validation Code:
XDocument xDoc = XDocument.Parse(xxxxxxx);
string xsdPath = ConfigUtils.GetXsdPath(XsdSchemaIdentifier.HHDataItem);
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);
fs.Close();
fs.Dispose();
xDoc.Validate(xss, null);
Lý do không thành công là XSD của bạn nhập các XSD khác. Khi bạn đang sử dụng một 'XmlReader', nó không có ý tưởng gì về vị trí của đầu vào' Stream' bên dưới, và vì vậy nó không có bất kỳ cách nào để tìm các mục nhập khẩu. Khi bạn cung cấp đường dẫn đến tệp lược đồ đến 'XmlSchemaSet', nó có thể thực hiện việc định vị riêng của nó dựa trên đường dẫn đó. – arootbeer