@drzaus У меня была эта работа в прошлом, но теперь, когда я добавляю ее, она генерирует как класс DataSet вместо классов, которые я ожидаю. Я просто добавляю существующий элемент и выбираю XSD-файл.
msmucker0527
Ответы:
490
достаточно просто; просто запустите (в командной строке vs)
xsd your.xsd /classes
(который создаст your.cs). Тем не менее, обратите внимание, что большинство встроенных опций не сильно изменились с 2.0
Для вариантов используйте xsd /?или смотрите MSDN ; например /enableDataBindingможет быть полезным.
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ Bin \ NETFX 4.5.1 Tools \ xsd.exe" / классы / язык: CS your.xsd
GeorgesC
2
Gravell снова на помощь! Хотя этот ответ на 100% правильный, в моем случае мне было проще всего добавить путь к каталогу xsd.exe в переменную среды PATH. Мой компьютер -> Свойства -> Дополнительно -> Переменные среды -> Путь - и добавьте «C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \» (конечно обратите особое внимание на версии Windows и .NET, специфичные для вашей машины) - удачного программирования!
pimbrouwers
15
В этом случае у вас есть несколько взаимосвязанных определений схемы, просто назовите их все. xsd schema1.xsd schema2.xsd schema3.xsd /c
Мивра
56
xsd.exe, как упомянуто Марком Грэвеллом. Самый быстрый способ запустить IMO.
Я не мог заставить xsd2code работать на меня вообще. xsd.exe более устойчив, но борется со схемами, имеющими «круговые» группы.
Джефф
xsd2code работает в visual studio 2017 и был именно тем, что я искал. сначала вы должны запустить его в каталоге программных файлов (x86), а затем использовать установщик vsix. тогда это прекрасно работает. это был НАЧАЛЬНО SUPERIOUR для xsd.exe, который генерировал массивы [] [] вместо lists.i имел гигантский .xsd, и мне нужно создать классы для сериализации XML в. xsd.exe не генерировал бы сериализуемый код (.net core 2), а xsd2code работал отлично
Исходный код xsd2code теперь называется xsd2code ++. Общественное издание
Gerd K
17
Я покажу вам самый простой способ использования Vs2017 и Vs2019. Откройте ваш xsd с помощью Visual Studio и сгенерируйте пример XML-файла, как указано в предложенном URL .
После того, как вы открыли свой xsd в режиме конструктора, как показано ниже, нажмите на проводник XML-схемы.
2. В «XML Schema Explorer» прокрутите весь путь вниз, чтобы найти корневой узел / узел данных. Щелкните правой кнопкой мыши по корневому узлу / узлу данных, и он покажет «Generate Sample XML». Если он не отображается, это означает, что вы находитесь не на узле элемента данных, а на каком-либо узле определения данных.
Скопируйте ваш сгенерированный XML в буфер обмена
Создайте новый пустой класс в своем решении и удалите определение класса. Должно остаться только пространство имен
Пока указатель мыши находится внутри вашего класса, выберите РЕДАКТИРОВАТЬ» -> «Вставить специальную» -> «Вставить XML как классы».
К сожалению, это не гарантирует генерацию всех классов, но это уловка COOL.
Джон Заброски
1
@JohnZabroski был ли у вас случай, что у вас не получилось? Это зависит от образца xml, если вы можете создать образец xml со всеми классами и членами, то нет причин пропустить ни один класс и элемент.
Батмачи
Моя точка зрения на шаг 2 не гарантированно работает. Но это крутой трюк.
Джон Заброски
Прекрасный ответ. Вы заслуживаете холодного пива !!
HenryGuillen17
14
xsd.exe плохо работает, когда у вас есть циклические ссылки (то есть тип может иметь элемент своего типа прямо или косвенно).
Когда существуют циклические ссылки, я использую Xsd2Code. Xsd2Code хорошо обрабатывает циклические ссылки и работает в VS IDE, что является большим плюсом. Он также имеет множество функций, которые вы можете использовать, например, создание кода сериализации / десериализации. Убедитесь, что вы включили GenerateXMLAttributes, если вы генерируете сериализацию (в противном случае вы получите исключения для упорядочения, если они не определены для всех элементов).
Ни один из них не работает хорошо с функцией выбора. в итоге вы получите списки / коллекции объектов, а не того типа, который вам нужен. Я бы порекомендовал избегать выбора в вашем xsd, если это возможно, так как это плохо сериализует / десериализует в строго типизированный класс. Если вас это не волнует, тогда это не проблема.
Любая функция в xsd2code десериализуется как System.Xml.XmlElement, что я считаю очень удобным, но может быть проблемой, если вы хотите строго типизированные объекты. Я часто использую любой, когда разрешаю настраиваемые данные конфигурации, поэтому XmlElement удобно передавать другому десериализатору XML, который определен в другом месте.
Я добавил xsd2code, посмотрев на ваш ответ. Нужно ли что-то менять, чтобы справиться с круговыми групповыми ссылками? У меня не работает со свойствами по умолчанию
Jyotsna Sonawane
Мне не нужно было делать ничего особенного, чтобы он работал с циклическими ссылками. Если вы опубликуете XML как новый вопрос и добавите сюда ссылку, я с удовольствием посмотрю на него.
Голосуйте за кофе
10
Для быстрого и ленивого решения (и вообще без использования VS) попробуйте эти онлайн-конвертеры:
<?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>
Который преобразует в эту структуру класса:
/*
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;}}}
Внимание! Примите во внимание, что это только для начала, результаты, очевидно, нуждаются в уточнениях!
Ответ Марка Гравелса был верным для меня, но мой xsd был с расширением .xml. Когда я использовал программу xsd, это дало: - The table (Amt) cannot be the child table to itself in nested relations.
В соответствии с этим KB325695 я переименовал расширение из .xml в .xsd, и оно работало нормально.
Однако, поскольку мой xml ссылался на несколько онлайновых xml (в моем случае http://www.w3.org/1999/xlink.xsdэто ссылки http://www.w3.org/2001/xml.xsd), мне пришлось также загрузить эти схемы, поместить их в тот же каталог, что и мой xsd, и затем перечислить эти файлы в команде:
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / language: CS your.xsd xlink.xsd xml.xsd
Это не случилось бы, что XSD на рынке Amazon - это то место, где вы сейчас строите классы :-) Мне приходилось работать с ними один раз, я никогда больше не буду трогать их или выполнять какую-либо работу в C # с использованием XSD-файлов amazons. такой беспорядок это нереально.
Shawty
@shawty Я работал со стандартами ГИС - WFS и WMS - которые определены большими XSD с круглыми ссылками. Был большой беспорядок, xsd.exeпотому что он не любит циклические ссылки, но в итоге я добился успеха.
Аске Б.
да, это было бы мое второе предположение. Видел их тоже, Тир не где так плохо , как амазонки вещи , хотя ... дает мне Кошмары вспомнить вздрагивает
Shawty
0
Наряду с WSDL у меня были файлы xsd. Вышеуказанное не сработало, в моем случае выдало ошибку. Работало следующим образом
Ответы:
достаточно просто; просто запустите (в командной строке vs)
(который создаст
your.cs
). Тем не менее, обратите внимание, что большинство встроенных опций не сильно изменились с 2.0Для вариантов используйте
xsd /?
или смотрите MSDN ; например/enableDataBinding
может быть полезным.источник
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe, как упомянуто Марком Грэвеллом. Самый быстрый способ запустить IMO.
Или если вам нужно больше гибкости / вариантов:
Надстройка xsd2code VS (Codeplex)
источник
Я покажу вам самый простой способ использования Vs2017 и Vs2019. Откройте ваш xsd с помощью Visual Studio и сгенерируйте пример XML-файла, как указано в предложенном URL .
2. В «XML Schema Explorer» прокрутите весь путь вниз, чтобы найти корневой узел / узел данных. Щелкните правой кнопкой мыши по корневому узлу / узлу данных, и он покажет «Generate Sample XML». Если он не отображается, это означает, что вы находитесь не на узле элемента данных, а на каком-либо узле определения данных.
источник
xsd.exe плохо работает, когда у вас есть циклические ссылки (то есть тип может иметь элемент своего типа прямо или косвенно).
Когда существуют циклические ссылки, я использую Xsd2Code. Xsd2Code хорошо обрабатывает циклические ссылки и работает в VS IDE, что является большим плюсом. Он также имеет множество функций, которые вы можете использовать, например, создание кода сериализации / десериализации. Убедитесь, что вы включили GenerateXMLAttributes, если вы генерируете сериализацию (в противном случае вы получите исключения для упорядочения, если они не определены для всех элементов).
Ни один из них не работает хорошо с функцией выбора. в итоге вы получите списки / коллекции объектов, а не того типа, который вам нужен. Я бы порекомендовал избегать выбора в вашем xsd, если это возможно, так как это плохо сериализует / десериализует в строго типизированный класс. Если вас это не волнует, тогда это не проблема.
Любая функция в xsd2code десериализуется как System.Xml.XmlElement, что я считаю очень удобным, но может быть проблемой, если вы хотите строго типизированные объекты. Я часто использую любой, когда разрешаю настраиваемые данные конфигурации, поэтому XmlElement удобно передавать другому десериализатору XML, который определен в другом месте.
источник
Для быстрого и ленивого решения (и вообще без использования VS) попробуйте эти онлайн-конвертеры:
Пример XSD:
Преобразует в XML:
Который преобразует в эту структуру класса:
Внимание! Примите во внимание, что это только для начала, результаты, очевидно, нуждаются в уточнениях!
источник
Я использую
XSD
в пакетном скрипте для генерации.xsd
файлов и классовXML
напрямую:источник
Команда, которая работала в моем случае, была:
источник
Ответ Марка Гравелса был верным для меня, но мой xsd был с расширением .xml. Когда я использовал программу xsd, это дало:
- The table (Amt) cannot be the child table to itself in nested relations.
В соответствии с этим KB325695 я переименовал расширение из .xml в .xsd, и оно работало нормально.
источник
Я использовал
xsd.exe
в командной строке Windows.Однако, поскольку мой xml ссылался на несколько онлайновых xml (в моем случае
http://www.w3.org/1999/xlink.xsd
это ссылкиhttp://www.w3.org/2001/xml.xsd
), мне пришлось также загрузить эти схемы, поместить их в тот же каталог, что и мой xsd, и затем перечислить эти файлы в команде:источник
xsd.exe
потому что он не любит циклические ссылки, но в итоге я добился успеха.Наряду с WSDL у меня были файлы xsd. Вышеуказанное не сработало, в моем случае выдало ошибку. Работало следующим образом
источник