Pergunta

Mais um desafio para a capacidade XSD,
I foram envio de arquivos XML pelos meus clientes, que vai ter 0 ou mais indefinido ou [chamada] tags inesperados (pode aparecer na hierarquia). Bem, eles são tags redundantes para mim .. então eu tenho que ignorar a sua presença, mas junto com eles há alguns conjunto de tags que são necessários para ser validado.

Este é um XML de exemplo:

<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 o XSD Eu tentei com:

  <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 não permite isso, devido a certas razões.
O exemplo acima mencionado é apenas um exemplo. O XML prática vem com a complexa hierarquia de tags XML ..

Por favor, deixe-me saber se você pode obter um corte da mesma.

A propósito, a solução alternativa é a de inserir-XSL transformação, antes do processo de validação. Bem, eu estou evitando isso porque eu preciso mudar o código .Net que desencadeia processo de validação, que é apoiado pelo menos pela minha empresa.

Foi útil?

Solução 2

Conclusão:

Isto não é possível com XSD. Todas as abordagens eu estava tentando alcançar a exigência foram nomeados como "ambígua" de validação-ferramentas, acompanhando monte de erros.

Outras dicas

No caso do seu não o tiver feito com isso, você pode tentar o seguinte:

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

No Linux esta multa trabalha com xmllint usando libxml versão 20706.

Talvez o seu é possível namespaces de uso:

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

Este provavelmente validar.

Eu enfrentei o mesmo problema.

Uma vez que liguei para a validação do .NET; I decidiu suprimir o erro de validação específico em ValidationEventHandler como uma solução alternativa. Ela trabalhou para mim.

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

É importante que Thread.CurrentUICulture deve ser definido como Inglês ou CultureInfo.InvariantCulture para o segmento atual para que isso funcione.

Você poderia fazer uso de um novo recurso do XML 1.1 chamado "Open Content". Em suma, permite que você especifique que elementos adicionais "desconhecido" pode ser adicionado a um tipo complexo em várias posições e que o analisador deve fazer se ele atinge qualquer um desses elementos

Usando XML 1.1, o seu tipo complexo seria:

<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 você tem um monte de tipos complexos, você também pode definir um modo de conteúdo aberto "default" na parte superior do seu esquema:

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

  ...
</xs:schema>

A especificação W3C para Open Content podem ser encontradas em http: //www.w3 .org / TR / xmlschema11-1 / # oc e há um bom writeup deste em http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

Infelizmente, .NET não suporta XML 1.1 como ainda não consigo encontrar nenhum XML livre 1.1 processadores -, mas um par de paga-para opções são:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top