Pregunta

Uno de los retos más a la capacidad de XSD,
He estado enviando archivos XML por mis clientes, que va a tener 0 o más indefinidos o [llamada] tags inesperados (Puede aparecer en la jerarquía). Bueno, ellos son etiquetas redundantes para mí .. por lo que tienen que hacer caso omiso de su presencia, pero junto con ellos hay algún conjunto de etiquetas que se requieren para ser validado.

Este es un ejemplo XML:

<root>
  <undefined_1>one</undefined_1>
  <undefined_2>two</undefined_2>
  <node>to_be_validated</node>
  <undefined_3>two</undefined_3>
  <undefined_4>two</undefined_4>
</root>

Y el XSD he intentado con:

  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType

XSD no lo permite, debido a ciertas razones.
El ejemplo mencionado anteriormente es sólo una muestra. El XML práctica viene con el complejo jerarquía de etiquetas XML ..

Por favor, hágamelo saber si usted puede conseguir un corte de la misma.

Por cierto, la solución alternativa es insertar XSL-transformación, antes del proceso de validación. Bien, estoy evitando porque tengo que cambiar el código .Net que desencadena el proceso de validación, que es apoyada por lo menos por mi compañía.

¿Fue útil?

Solución 2

Conclusión:

Esto no es posible con XSD. Todos los enfoques que estaba tratando de alcanzar el requisito fueron nombrados como "ambigua" de validación-herramientas, montón de errores que acompaña.

Otros consejos

En caso de que su no lo ha hecho con esto, es posible que intente lo siguiente:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Bajo Linux esto funciona bien con xmllint usando libxml versión 20706.

Tal vez sea posible utilizar espacios de nombres:

<xs:element name="root" type="root"></xs:element> 
  <xs:complexType name="root"> 
    <xs:sequence> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
      <xs:element name="node" type="xs:string"/> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
  </xs:complexType>

Esto probablemente validar.

Me enfrenté al mismo problema.

Desde que llamé a la validación de .NET; Decidí suprimir el error de validación específico en ValidationEventHandler como una solución. Se trabajó para mí.

    private void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Warning:
                // Processing warnings
                break;
            case XmlSeverityType.Error:
                if (IgnoreUnknownTags
                    && e.Exception is XmlSchemaValidationException
                    && new Regex(
                        @"The element '.*' has invalid child element '.*'\."
                        + @" List of possible elements expected:'.*'\.")
                       .IsMatch(e.Exception.Message))
                {
                    return;
                }
                // Processing errors
                break;
            default:
                throw new InvalidEnumArgumentException("Severity should be one of the valid values");
        }
    }

Es importante que Thread.CurrentUICulture debe establecerse en Inglés o CultureInfo.InvariantCulture para el subproceso actual para que esto funcione.

Se puede hacer uso de una nueva característica de XML 1.1 llamado "contenido abierto". En pocas palabras, le permite especificar que los elementos "desconocidos" adicionales se pueden agregar a un tipo complejo en varias posiciones y Lo que el intérprete debe hacer si llega a cualquiera de esos elementos

El uso de XML 1.1, el tipo de complejo se convertiría en:

<xs:element name="root" type="root" />
<xs:complexType name="root"> 
  <xs:openContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:openContent>

  <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
  </xs:sequence> 
</xs:complexType>

Si usted tiene una gran cantidad de tipos complejos, también puede establecer un modo de contenido abierto "por defecto" en la parte superior de su esquema:

<xs:schema ...>
  <xs:defaultOpenContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:defaultOpenContent>

  ...
</xs:schema>

La especificación W3C para el contenido abierto se puede encontrar en http: //www.w3 .org / TR / xmlschema11-1 / oc # y hay una buena valoración crítica de esta http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

Por desgracia, .NET no es compatible con XML 1.1 hasta el momento no puedo encontrar ninguna libre XML 1.1 procesadores - pero un par de pago para opciones son:

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