Validação XML usando XSD
-
27-09-2019 - |
Pergunta
Eu tenho um XML com o seguinte formato.
<RootNode>
<Parent>
<Child1>Some text about child 1</Child1>
<Child2>Some text about child 2</Child2>
....
....
<Child5>Some text about child 5</Child5>
....
....
<Childn>Some text about child n</Childn>
</Parent>
</RootNode>
Agora eu quero validar este XML contra o XSD.
Mas o problema é o número e o nome do nó das crianças não são consertados.
Por favor, verifique as seguintes amostras do meu arquivo
Amostra 1: Duas crianças com nome do nó Child1 e Child2
<RootNode>
<Parent>
<Child1>Some text about child 1</Child1>
<Child2>Some text about child 2</Child2>
</Parent>
</RootNode>
Amostra 2: Três crianças com nome do nó Child4 Child5 e Child8
<RootNode>
<Parent>
<Child4>Some text about child 4</Child4>
<Child5>Some text about child 5</Child4>
<Child8>Some text about child 8</Child8>
</Parent>
</RootNode>
Eu quero que um valide o texto dentro do nó filho (que é mostrado como "algum texto sobre criança n") com a regra seguinte
Regra: O XML é inválido se qualquer nó filho - (filhos dos pais) tem comprimento de texto INER mais do que 256.
Isso significa considerar o XML inválido se houver um filho do nó "pai" tem texto interno por mais de 256 caracteres
Isso é possível usando a validação do esquema XSD? Você poderia me ajudar a criar um arquivo .xsd para validar isso?
desde já, obrigado
Solução
Você não pode resolver isso com o XSD, como foi dito antes simplesmente porque não sabe quais todos os nomes de elementos serão antecipadamente. Se você não estiver totalmente ligado à validação do XSD, pode querer dar uma olhada Schematron o que pode fazer exatamente esse tipo de validação.
Outras dicas
Não é possível validar isso automaticamente porque o número máximo de nós filhos é desconhecido. Você pode obter escrevendo alguma validação manual.
Se você conseguir alterar o formato deste XML, deve, porque ele é mal projetado (principalmente porque não é validável ...). Você deve atirar para algo mais como:
<RootNode>
<Parent>
<Child num="1">...</Child>
<Child num="2">...</Child>
</Parent>
</RootNode>
Ou, se o pai puder conter outras coisas e as crianças, ter um recipiente para as crianças é útil:
<RootNode>
<Parent>
<OtherStuff/>
<Children>
<Child num="1">...</Child>
<Child num="2">...</Child>
</Children>
<MoreStuff/>
</Parent>
</RootNode>