@drzaus Eu tive esse trabalho no passado, mas agora, quando adiciono um, gera como uma classe DataSet em vez das classes que eu esperaria. Acabei de adicionar um item existente e selecione o arquivo XSD.
msmucker0527
Respostas:
490
simples o suficiente; basta executar (no prompt de comando vs)
xsd your.xsd /classes
(que criará your.cs). Observe, no entanto, que a maioria das opções intrínsecas aqui não mudou muito desde a versão 2.0
Para as opções, use xsd /?ou consulte o MSDN ; por exemplo, /enableDataBindingpode ser útil.
"C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / idioma: CS your.xsd
GeorgesC
2
Gravell para o resgate novamente! Embora essa resposta seja 100% correta, no meu caso, achei mais fácil adicionar o caminho do diretório xsd.exe à variável de ambiente PATH. Meu computador -> propriedades -> avançado -> variáveis de ambiente -> Caminho - e adicione "C: \ Arquivos de Programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" (é claro preste muita atenção às versões Windows e .NET específicas para sua máquina) - codificação feliz!
Pimbrouwers 09/07/19
15
Para o caso, você tem várias definições de esquema interligadas, apenas nomeie todas elas. xsd schema1.xsd schema2.xsd schema3.xsd /c
Mivra # 24/16
56
xsd.exe conforme mencionado por Marc Gravell. A maneira mais rápida de iniciar e executar o IMO.
Ou se você precisar de mais flexibilidade / opções:
Não consegui que o xsd2code funcionasse para mim. O xsd.exe é mais robusto, mas enfrenta esquemas que possuem grupos "circulares".
Jeff
O xsd2code funciona no visual studio 2017 e era exatamente o que eu estava procurando. você deve executá-lo primeiro no diretório de arquivos do programa (x86) e depois usar o instalador do vsix. então funciona muito bem. era MUITO SUPERIOUR para o xsd.exe que gerava matrizes [] [] em vez de lists.i tinha um .xsd gigante e preciso criar classes para serializar o XML. xsd.exe não iria gerar código serializado (core .net 2) e xsd2code funcionou muito bem
Eu mostro aqui a maneira mais fácil de usar o Vs2017 e o Vs2019 Abra o seu xsd com o Visual Studio e gere um exemplo de arquivo xml como no URL sugerido.
Depois de abrir o xsd no modo de exibição de design, como abaixo, clique em xml schema explorer
2. No "XML Schema Explorer", role até o fim para encontrar o nó raiz / dados. Clique com o botão direito do mouse no nó raiz / dados e ele mostrará "Gerar XML de Amostra". Se não aparecer, significa que você não está no nó do elemento de dados, mas em qualquer um dos nós de definição de dados.
Copie o Xml gerado para a área de transferência
Crie uma nova classe vazia em sua solução e exclua a definição de classe. Somente o namespace deve permanecer
Enquanto o ponteiro do mouse estiver focado dentro da sua classe, escolha EDIT-> Colar Especial-> Colar Xml como Classes
Infelizmente, isso não é garantido para gerar todas as classes, mas é um truque COOL.
John Zabroski 23/01
1
@JohnZabroski você teve algum caso em que não funcionou para você? Depende da amostra xml, se você pode criar amostra xml com todas as classes e membros, não há motivo para perder nenhuma classe e membro.
batmaci 23/01
Meu ponto é o passo 2 não é garantido que funcione. Mas é um truque legal.
John Zabroski 23/01
Resposta maravilhosa. Você merece algumas cervejas geladas !!
HenryGuillen17
14
O xsd.exe não funciona bem quando você tem referências circulares (ou seja, um tipo pode possuir um elemento de seu próprio tipo direta ou indiretamente).
Quando existem referências circulares, eu uso o Xsd2Code. O Xsd2Code lida bem com referências circulares e funciona no VS IDE, o que é uma grande vantagem. Ele também possui muitos recursos que você pode usar como gerar o código de serialização / desserialização. Certifique-se de ativar os atributos GenerateXMLAt se estiver gerando serialização (caso contrário, você obterá exceções para pedidos, se não definidas em todos os elementos).
Nem funciona bem com o recurso de escolha. você terminará com listas / coleções de objetos em vez do tipo que deseja. Eu recomendo evitar a escolha no seu xsd, se possível, pois isso não serializa / desserializa bem em uma classe fortemente tipada. Se você não se importa com isso, porém, não há problema.
O recurso any no xsd2code desserializa como System.Xml.XmlElement, o que eu acho realmente conveniente, mas pode ser um problema se você quiser objetos com tipos fortes. Eu costumo usar qualquer um deles ao permitir dados de configuração personalizados, portanto, um XmlElement é conveniente para passar para outro desserializador XML personalizado definido em outro local.
Adicionei xsd2code olhando para sua resposta. Precisamos mudar alguma coisa para que ele cuide das referências circulares do grupo? Ele não está trabalhando para mim com propriedades padrão
Jyotsna Sonawane
Não precisei fazer nada de especial para trabalhar com referências circulares. Se você postar o xml como uma nova pergunta e adicionar um link aqui, fico feliz em dar uma olhada nele.
precisa saber é o seguinte
10
Para uma solução rápida e preguiçosa (e sem usar o VS), tente estes conversores online:
<?xml version="1.0" encoding="utf-8"?><!--Created with LiquidTechnologiesOnlineTools1.0(https://www.liquid-technologies.com) --><shiporder xsi:noNamespaceSchemaLocation="schema.xsd" orderid="string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><orderperson>string</orderperson><shipto><name>string</name><address>string</address><city>string</city><country>string</country></shipto><item><title>string</title><note>string</note><quantity>3229484693</quantity><price>-6894.465094196054907</price></item><item><title>string</title><note>string</note><quantity>2181272155</quantity><price>-2645.585094196054907</price></item><item><title>string</title><note>string</note><quantity>2485046602</quantity><price>4023.034905803945093</price></item><item><title>string</title><note>string</note><quantity>1342091380</quantity><price>-810.825094196054907</price></item></shiporder>
O que é convertido nessa estrutura de classes:
/*
Licensed under the Apache License, Version 2.0
http://www.apache.org/licenses/LICENSE-2.0
*/
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp{[XmlRoot(ElementName="shipto")]publicclassShipto{[XmlElement(ElementName="name")]publicstringName{get;set;}[XmlElement(ElementName="address")]publicstringAddress{get;set;}[XmlElement(ElementName="city")]publicstringCity{get;set;}[XmlElement(ElementName="country")]publicstringCountry{get;set;}}[XmlRoot(ElementName="item")]publicclassItem{[XmlElement(ElementName="title")]publicstringTitle{get;set;}[XmlElement(ElementName="note")]publicstringNote{get;set;}[XmlElement(ElementName="quantity")]publicstringQuantity{get;set;}[XmlElement(ElementName="price")]publicstringPrice{get;set;}}[XmlRoot(ElementName="shiporder")]publicclassShiporder{[XmlElement(ElementName="orderperson")]publicstringOrderperson{get;set;}[XmlElement(ElementName="shipto")]publicShiptoShipto{get;set;}[XmlElement(ElementName="item")]publicList<Item>Item{get;set;}[XmlAttribute(AttributeName="noNamespaceSchemaLocation",Namespace="http://www.w3.org/2001/XMLSchema-instance")]publicstringNoNamespaceSchemaLocation{get;set;}[XmlAttribute(AttributeName="orderid")]publicstringOrderid{get;set;}[XmlAttribute(AttributeName="xsi",Namespace="http://www.w3.org/2000/xmlns/")]publicstringXsi{get;set;}}}
Atenção! Leve em conta que isso é apenas para começar, os resultados obviamente precisam de aprimoramentos!
A resposta de Marc Gravells foi certa para mim, mas meu xsd estava com a extensão .xml. Quando eu usei o programa xsd, ele dava: - The table (Amt) cannot be the child table to itself in nested relations.
De acordo com este KB325695 , renomei a extensão de .xml para .xsd e funcionou bem.
No entanto, como meu xml referenciou vários xmls on-line (no meu caso, http://www.w3.org/1999/xlink.xsdquais referências http://www.w3.org/2001/xml.xsd) eu também precisei baixar esses esquemas, colocá-los no mesmo diretório que meu xsd e listar esses arquivos no comando:
"C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / idioma: CS your.xsd xlink.xsd xml.xsd
Esse não seria o XSD do mercado da Amazon, onde você criaria aulas por enquanto :-) Eu tive que trabalhar com eles uma vez, nunca mais tocarei neles ou faria qualquer trabalho em C # usando arquivos XSD da amazon. essa bagunça é irreal.
quer
@shawty Eu estava trabalhando com os padrões GIS - WFS e WMS - que são definidos por XSDs grandes e com referências cruzadas. Foi uma grande bagunça xsd.exeporque não gosta de referências circulares, mas no final fui bem-sucedida.
Aske B.
sim, esse teria sido meu segundo palpite. Visto os demais, ao melhor não onde perto tão ruim quanto o material Amazonas embora ... me dá pesadelos lembrando tremores
shawty
0
Junto com o WSDL, eu tinha arquivos xsd. O exemplo acima não funcionou no meu caso deu erro. Funcionou da seguinte maneira
Respostas:
simples o suficiente; basta executar (no prompt de comando vs)
(que criará
your.cs
). Observe, no entanto, que a maioria das opções intrínsecas aqui não mudou muito desde a versão 2.0Para as opções, use
xsd /?
ou consulte o MSDN ; por exemplo,/enableDataBinding
pode ser útil.fonte
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe conforme mencionado por Marc Gravell. A maneira mais rápida de iniciar e executar o IMO.
Ou se você precisar de mais flexibilidade / opções:
xsd2code VS suplemento (Codeplex)
fonte
Eu mostro aqui a maneira mais fácil de usar o Vs2017 e o Vs2019 Abra o seu xsd com o Visual Studio e gere um exemplo de arquivo xml como no URL sugerido.
2. No "XML Schema Explorer", role até o fim para encontrar o nó raiz / dados. Clique com o botão direito do mouse no nó raiz / dados e ele mostrará "Gerar XML de Amostra". Se não aparecer, significa que você não está no nó do elemento de dados, mas em qualquer um dos nós de definição de dados.
fonte
O xsd.exe não funciona bem quando você tem referências circulares (ou seja, um tipo pode possuir um elemento de seu próprio tipo direta ou indiretamente).
Quando existem referências circulares, eu uso o Xsd2Code. O Xsd2Code lida bem com referências circulares e funciona no VS IDE, o que é uma grande vantagem. Ele também possui muitos recursos que você pode usar como gerar o código de serialização / desserialização. Certifique-se de ativar os atributos GenerateXMLAt se estiver gerando serialização (caso contrário, você obterá exceções para pedidos, se não definidas em todos os elementos).
Nem funciona bem com o recurso de escolha. você terminará com listas / coleções de objetos em vez do tipo que deseja. Eu recomendo evitar a escolha no seu xsd, se possível, pois isso não serializa / desserializa bem em uma classe fortemente tipada. Se você não se importa com isso, porém, não há problema.
O recurso any no xsd2code desserializa como System.Xml.XmlElement, o que eu acho realmente conveniente, mas pode ser um problema se você quiser objetos com tipos fortes. Eu costumo usar qualquer um deles ao permitir dados de configuração personalizados, portanto, um XmlElement é conveniente para passar para outro desserializador XML personalizado definido em outro local.
fonte
Para uma solução rápida e preguiçosa (e sem usar o VS), tente estes conversores online:
Exemplo XSD:
Converte em XML:
O que é convertido nessa estrutura de classes:
Atenção! Leve em conta que isso é apenas para começar, os resultados obviamente precisam de aprimoramentos!
fonte
Eu uso
XSD
em um script em lote para gerar.xsd
arquivos e classesXML
diretamente:fonte
O comando que funcionou no meu caso foi:
fonte
A resposta de Marc Gravells foi certa para mim, mas meu xsd estava com a extensão .xml. Quando eu usei o programa xsd, ele dava:
- The table (Amt) cannot be the child table to itself in nested relations.
De acordo com este KB325695 , renomei a extensão de .xml para .xsd e funcionou bem.
fonte
Eu usei
xsd.exe
no prompt de comando do Windows.No entanto, como meu xml referenciou vários xmls on-line (no meu caso,
http://www.w3.org/1999/xlink.xsd
quais referênciashttp://www.w3.org/2001/xml.xsd
) eu também precisei baixar esses esquemas, colocá-los no mesmo diretório que meu xsd e listar esses arquivos no comando:fonte
xsd.exe
porque não gosta de referências circulares, mas no final fui bem-sucedida.Junto com o WSDL, eu tinha arquivos xsd. O exemplo acima não funcionou no meu caso deu erro. Funcionou da seguinte maneira
fonte