web-dev-qa-db-ja.com

XSDファイルでGuidタイプを使用する正しい方法は何ですか?

VisualStudioのxsd.exeツールでコードを生成するために使用する.xsdファイルがあります。一部のクラスメンバーはGUIDであり、xsd.exeツールは2つの警告を出します。

名前空間 ' http://Microsoft.com/wsdl/types/ 'は、このスキーマで参照できません。タイプ ' http://Microsoft.com/wsdl/types/:guid 'は宣言されていません。

生成されたC#ファイルが有効で機能するため、Guidタイプが認識されます。誰かがそれらの警告を取り除く方法を知っていますか?

検証されるXSDとSystem.Guidとして生成されるクラスメンバーの正しい構文は何ですか?

25
erbi

みなさん、ありがとうございました。警告を削除する方法を見つけました。

sysrqb が言ったように、wsdl名前空間は削除されているか、存在していません。 xsd.exeツールはGuid定義を内部的に認識しているようですが、xsdスキーマを検証できません。

boj が指摘しているように、Guidを含むスキーマを検証する唯一の方法は、スキーマでその型を(再)定義することです。ここでの秘訣は、Guidタイプを同じ " http://Microsoft.com/wsdl/types "名前空間に追加することです。このようにして、xsd.exeは http://Microsoft.com/wsdl/types:Guid とSystem.Guidの間で適切な関連付けを行います。

Guidタイプの新しいxsdファイルを作成しました。

<?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ファイルとこの新しいxsdファイルの両方を使用してxsd.exeを実行します。

xsd.exe myschema.xsd guid.xsd /c
42
erbi

here からの引用:

   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/");
3
boj

Wsdl名前空間拡張ページが削除されたようです。そのため、必要な型情報が見つかりません。

1
rmmh