سؤال

وربما هذا هو سؤال ساذج حول 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"/>؟ في هذا السيناريو، يجب عليك الحصول على القيم الافتراضية لسمات في عداد المفقودين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top