27

我有一个 .xsd 文件,用于使用 Visual Studio 中的 xsd.exe 工具生成代码。一些类成员是 Guid,xsd.exe 工具给出 2 个警告:

命名空间“ http://microsoft.com/wsdl/types/ ”不可在此架构中引用。未声明类型“ http://microsoft.com/wsdl/types/:guid ”。

由于生成的 C# 文件有效且有效,因此可以识别 Guid 类型。任何人都知道如何摆脱这些警告?

要验证 XSD 并将类成员生成为 System.Guid 的正确语法是什么?

4

3 回答 3

47

谢谢大家,我找到了如何删除警告。

正如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
于 2009-04-06T20:20:34.453 回答
3

从这里引用:

   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/");
于 2009-03-26T23:16:47.590 回答
1

看起来那个 wsdl 命名空间扩展页面被删除了,所以它找不到你需要的类型信息。

于 2009-03-26T23:10:12.553 回答