Pregunta

Esta es probablemente una pregunta ingenua sobre XmlReader, pero no he encontrado una respuesta en los documentos de MSDN.

Supongamos que tengo 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>

bien formado XML documento SchemaTest.xml conforme a este esquema

<?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>

y que trato de leer este documento con una XmlReader como sigue.

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();
    }
}

Actualmente estoy recibiendo un System.FormatException indicando que el contenido del elemento width no está en el formato correcto.Parece que reader está intentando leer el contenido del elemento y no utiliza de forma predeterminada el valor predeterminado especificado en el esquema.¿Cuál es la forma correcta de manejar esto?

Además, tengo entendido que para los elementos, el esquema solo proporciona un valor predeterminado si un elemento aparece con contenido vacío, pero no proporciona un valor predeterminado si falta el elemento.¿Implica esto que no hay manera de obtener un valor predeterminado para los elementos opcionales que faltan?

¿Fue útil?

Solución

En cuanto a trabajar con elementos vacíos, establezca settings.ValidationType = ValidationType.Schema y debería obtener el valor predeterminado como desee.

En cuanto a los elementos faltantes, se consideran, bueno, faltantes ;-) y, por lo tanto, no tienen un valor predeterminado.Teóricamente, podrías analizar el esquema (p. ej.utilizando el modelo de objetos de esquema) para obtener el valor predeterminado.Pero eso iría en contra de las especificaciones.

¿Has considerado usar atributos, como <pageSettings height="55"/>?En ese escenario, debería obtener los valores predeterminados para los atributos faltantes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top