Domanda

Ancora una sfida alla capacità XSD,
mi è stato l'invio di file XML dai miei clienti, che sarà avere 0 o più indefiniti o [chiamata] Tag inaspettate (Può apparire in gerarchia). Beh sono tag ridondanti per me .. così ho avuto modo di ignorare la loro presenza, ma insieme a loro ci sono alcuni set di tag che devono essere convalidati.

Questo è un XML di esempio:

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

E il XSD ho provato 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 non permette questo, a causa di alcuni motivi.
L'esempio di cui sopra è solo un esempio. L'XML pratica viene fornito con il complesso gerarchia dei tag XML ..

lasciato gentilmente sapere se è possibile ottenere un hack di esso.

A proposito, la soluzione alternativa è quella di inserire XSL-trasformazione, prima del processo di convalida. Beh, sto evitando, perché ho bisogno di modificare il codice .Net che innesca il processo di validazione, che è supportato almeno dalla mia azienda.

È stato utile?

Soluzione 2

Conclusione:

Questo non è possibile con XSD. Tutti gli approcci che stavo cercando di raggiungere il requisito sono stati nominati come "ambiguo" di validazione-tools, accompagnando mucchio di errori.

Altri suggerimenti

Nel caso il vostro non già fatto con questo, si potrebbe provare quanto segue:

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

Sotto Linux Questo funziona bene con xmllint utilizzando libxml versione 20706.

Forse il suo è possibile utilizzare gli spazi dei nomi:

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

Questa sarà probabilmente la convalida.

Ho affrontato lo stesso problema.

Da quando ho chiamato la convalida da .NET; Ho deciso di sopprimere l'errore di convalida specifica in ValidationEventHandler come una soluzione. Ha funzionato per me.

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

E 'importante che Thread.CurrentUICulture deve essere impostato su inglese o CultureInfo.InvariantCulture per il thread corrente per far funzionare tutto questo.

Si potrebbe fare uso di una nuova funzionalità di XML 1.1 chiamato "Open Content". In breve, consente di specificare che gli elementi aggiuntivi "sconosciuti" possono essere aggiunti ad un tipo complesso in varie posizioni e ciò che il parser dovrebbe fare se colpisce uno qualsiasi di questi elementi

Utilizzo di XML 1.1, il tipo di complesso diventerebbe:

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

Se avete un sacco di tipi complessi, è possibile anche impostare un "default" modalità open content nella parte superiore del vostro schema:

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

  ...
</xs:schema>

La specifica W3C per Open Content sono disponibili all'indirizzo http: //www.w3 .org / TR / xmlschema11-1 / # oc e c'è una buona resoconto scritto di questo in http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

Purtroppo, .NET non supporta XML 1.1 come ancora non riesco a trovare alcun XML libero 1.1 processori - ma un paio di pagamento per le opzioni sono:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top