XmlReader الحصول الافتراضي عنصر من مخطط
سؤال
وربما هذا هو سؤال ساذج حول XmlReader
، لكني لم التفت حتى جوابا في المستندات MSDN.
لنفترض أن لدي XSD SchemaTest.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="pageSettings">
<xs:complexType>
<xs:sequence>
<xs:element name="width" type="xs:decimal" default="8.5" minOccurs="0"/>
<xs:element name="height" type="xs:decimal" default="11" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
وبشكل جيد XML
ثيقة SchemaTest.xml
تتفق مع هذا المخطط
<?xml version="1.0" encoding="utf-8" ?>
<pageSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SchemaTest.xsd">
<width/>
<height>11</height>
</pageSettings>
وأنني أحاول أن أقرأ هذه الوثيقة مع XmlReader
على النحو التالي.
static void Main(string[] args) {
decimal width;
decimal height;
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.Schemas.Add(null, "C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xsd");
using (XmlReader reader = XmlReader.Create("C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xml", settings)) {
reader.ReadStartElement();
if (reader.Name == "width") {
width = reader.ReadElementContentAsDecimal("width", "");
// if fail, width = default from schema
}
if (reader.Name == "height") {
height = reader.ReadElementContentAsDecimal("height", "");
// if fail, height = default from schema
}
reader.ReadEndElement();
}
}
وحاليا أنا تلقي System.FormatException
مشيرا إلى أن المحتوى على width
العنصر ليس في التنسيق الصحيح. ويبدو أن reader
تحاول قراءة محتوى في العنصر وليس التخلف إلى القيمة الافتراضية المحددة في المخطط. ما هي الطريقة الصحيحة للتعامل مع هذا؟
وعلاوة على ذلك، أفهم أن لعناصر المخطط يوفر فقط قيمة افتراضية إذا ظهر عنصر مع محتوى فارغ ولكنها لا توفر قيمة افتراضية إذا كان العنصر مفقود. هل هذا يعني أن ليس هناك طريقة للحصول على القيمة الافتراضية للعناصر الاختيارية التي مفقودة؟
المحلول
وأما العمل مع العناصر الفارغة، تعيين settings.ValidationType = ValidationType.Schema
ويجب عليك الحصول على القيمة الافتراضية كما تريد.
وفيما يتعلق العناصر المفقودة، وتعتبر تلك، أيضا، في عداد المفقودين ؛-) وبالتالي لم يكن لديك القيمة الافتراضية. نظريا، يمكن أن تحليل مخطط (على سبيل المثال، باستخدام نموذج كائن مخطط) للحصول على القيمة الافتراضية. ولكن ذلك سيكون ضد المواصفات.
هل تعتبر استخدام السمات، مثل <pageSettings height="55"/>
؟ في هذا السيناريو، يجب عليك الحصول على القيم الافتراضية لسمات في عداد المفقودين.