Как правильно использовать тип Guid в файле XSD? - PullRequest
25 голосов
/ 27 марта 2009

У меня есть файл .xsd, который я использую для генерации кода с помощью инструмента xsd.exe из Visual Studio. Некоторые ученики - Guids, и инструмент xsd.exe выдает 2 предупреждения:

Пространство имен 'http://microsoft.com/wsdl/types/' недоступно для ссылки в этой схеме. Тип 'http://microsoft.com/wsdl/types/:guid' не объявлен.

Тип Guid распознается, поскольку созданный файл C # является действительным и работает. Кто-нибудь знает, как избавиться от этих предупреждений?

Какой правильный синтаксис для проверяемого XSD И членов класса, генерируемых как System.Guid?

Ответы [ 3 ]

41 голосов
/ 07 апреля 2009

Спасибо всем, Я нашел, как убрать предупреждения.

Как сказал sysrqb , пространство имен wsdl либо удалено, либо никогда не существовало. Кажется, что инструмент xsd.exe знает внутреннее определение Guid, но не может проверить схему xsd.

Как указывал boj , единственный способ проверить схему с Guids в ней - это (пере) определить этот тип в схеме. Хитрость заключается в том, чтобы добавить тип Guid к тому же пространству имен "http://microsoft.com/wsdl/types"". Таким образом, xsd.exe будет правильно сопоставлять http://microsoft.com/wsdl/types:Guid и System.Guid

Я создал новый xsd-файл для типа guid:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://microsoft.com/wsdl/types/" >
    <xs:simpleType name="guid">
        <xs:annotation>
            <xs:documentation xml:lang="en">
                The representation of a GUID, generally the id of an element.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="\{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\}"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Затем я запускаю xsd.exe как с моим исходным файлом xsd, так и с новым файлом xsd:

xsd.exe myschema.xsd guid.xsd /c
3 голосов
/ 27 марта 2009

Цитата из здесь :

   XmlSchema guidSchema = new XmlSchema();
   guidSchema.TargetNamespace = "http://microsoft.com/wsdl/types/";

   XmlSchemaSimpleTypeRestriction guidRestriction = new XmlSchemaSimpleTypeRestriction();
   guidRestriction.BaseTypeName = new XmlQualifiedName("string", XmlSchema.Namespace);

   XmlSchemaPatternFacet guidPattern = new XmlSchemaPatternFacet();
   guidPattern.Value = @"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
   guidRestriction.Facets.Add(guidPattern);

   XmlSchemaSimpleType guidType = new XmlSchemaSimpleType();
   guidType.Name = "guid";
   guidType.Content = guidRestriction;
   guidSchema.Items.Add(guidType);

   schemaSet.Add(guidSchema);

   XmlSchema speakerSchema = new XmlSchema();
   speakerSchema.TargetNamespace = "http://www.microsoft.com/events/teched2005/";

   // ...

   XmlSchemaElement idElement = new XmlSchemaElement();
   idElement.Name = "ID";

   // Here's where the magic happens...

   idElement.SchemaTypeName = new XmlQualifiedName("guid", "http://microsoft.com/wsdl/types/");
1 голос
/ 27 марта 2009

Похоже, что страница расширения пространства имен wsdl была удалена, поэтому она не может найти необходимую информацию о типе.

...