Pergunta

Eu gostaria de saber o melhor método para resolver este problema: Eu gostaria de criar um xml modelo em branco de um esquema XML. Todos os elementos e atributos necessários seriam criados e seus valores seriam todas as cadeias vazias.

O próximo passo é como determinar quais nós xml criança um certo nó poderia ter. por exemplo. Eu selecionar um nó tem tem minOccurs = "0", maxOccurs = "ilimitados" para um de seus filhos. Eu seria capaz de determinar tudo sobre essa criança, seus atributos, seu nome, o seu tipo de valor, etc.

Para dar mais contexto sobre a situação, eu estou trabalhando em uma ferramenta que permite aos usuários editar arquivos XML em um ambiente mais amigável. Por exemplo, eles poderiam adicionar uma nova conta para o nó 'conta db' e veriam que o nó só está disponível é um nó de conta. Em seguida, quando eles tentam adicionar as crianças para o nó de conta e as escolhas seria nó nome (necessária), nó de senha (obrigatório), nó de configurações (opcional), etc. Como posso determinar programaticamente o que as crianças o nó conta tem disponível para -lo e quais os atributos e as configurações estão na essas crianças?

Este é em C # 2.0 com .NET 2.0.

resumo In, quais as classes que eu uso para ler um esquema e analisá-lo para obter informações úteis para a criação de um xml? Na minha ingenuidade eu tinha esperança que desde xsd foi xml em si haveria algum tipo de modelo DOM que eu poderia atravessar.

Gostaria que esta a ser confinado ao meu programa para nenhum uso de ferramentas externas, como OxygenXml, VS, xsd.exe, etc.

Foi útil?

Solução

Parece que o que você quer fazer é replicado a funcionalidade trás intellisense XML na maioria dos bons editores XML. ou seja, ler um esquema XML e trabalhar fora quais elementos e atributos podem vir a seguir.

Temos feito algo muito semelhante em um projeto que trabalhou em algum tempo atrás. Para produzir algo que na maioria das vezes funciona é um monte de trabalho, ao produto algo que funciona o tempo todo é cargas de trabalho!

Basicamente, você precisa carregar o XSD (o XmlSchema objetos no .net permitem que você faça isso). Mas o modelo de objeto SOM eles expõem é muito cru, então você precisa fazer um monte de trabalho para interpretá-lo. Se você ignorar conceitos como grupos de substituição, extensão complexType, esquemas camaleão e namesapces, você deve ser capaz de navegar no SOM razoavelmente facilmente.

Você próxima precisa descobrir onde você está no documento XML com relação ao seu esquema. Uma vez que você sabe foram você está no SOM você pode então começar a trabalhar fora das opções disponíveis.

Para fazer isso corretamente é 1.000' de linhas de código e 4-12 homem semanas de trabalho. Você pode ser capaz de conseguir algo juntos básica em poucas semanas?

Outras dicas

Eu tenho sangramento meus olhos com a documentação do MSDN e eu acho que eu peguei um perfume. Carregar um esquema utilizando XmlSchema.Read e compilá-lo. A propriedade Elements irá conter uma coleção de elementos 'nível superior'. Você vai ter que codificar o nome qualificado do elemento de raiz ou algo assim. Então é isso. Eu não encontrei a forma de encontrar os 'conteúdos' sob um determinado elemento do esquema ainda.

Edit: Eu encontrei mais alguns caminhos a percorrer, mas ainda não é claro como cristal. XmlSchemaElements tem uma propriedade tipo de esquema. Este é simples ou complexa. tipos complexos em esquema XML pode ter atributos, sequências, grupos, etc. As sequências têm uma propriedade chamada de partículas que pode ser um elemento. E o ciclo se repete. Mas eu acho que a parte mais difícil na implementação seria para se certificar de que você cobrir todos os casos possíveis (tipo simples, tipo complexo com atributo, tipo complexo com atributos e elementos, extensões, a coisa toda).

Edit: Uso do objeto XmlSchema elemento de propriedade para obter uma XmlSchemaElement. Use propriedade SchemaType do XmlSchemaElement para obter tipo simples ou complexo. Use propriedade de atributo do XmlSchemaComplexType para obter atributos ou ContentModel para obter 'conteúdo simples' / 'conteúdo complexo' ou partículas para obter 'seqüência' / 'escolha' / 'all'. Basicamente um monte de viajar para baixo propriedades e verificando os tipos e lançando objetos esquerda e direita e verificação de todos os possíveis arranjos de objetos XSD. Para criar uma biblioteca seria longo e complicado e propenso a erros. E isso é com esquemas XML, com dtds eu não quero nem começar a pensar. Uau, esquemas XML são necessárias, mas por que eles têm que ser tão mal.

Você pode usar uma ferramenta de terceiros, como XMLSPY ( ligação ). Fará um xml manequim da XSD ou vice-versa.

Um realmente rotunda (mas livre) maneira que você poderia fazer com ferramentas .NET que existem em sua máquina seria usar xsd.exe ( link ) para gerar a entidade objetos que seus define esquema usando o seguinte:

xsd /classes /language:CS XSDSchemaFile.xsd

Então, quando você tem objetos, carregá-los em um projeto e serializar-los. Você pode preencher propriedades e tal, se você quiser adicionar alguns dados fictícios.

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