XmlSchemaProviderAttribute和xsd:import

时间:2010-12-26 13:25:39

标签: flex wcf wsdl

我们正在使用一个使用XmlSchemaProviderAttribute的自定义类,以使其看起来像一个字符串。声明如下:

 [XmlSchemaProvider("GetSchema")]
public sealed class CDataWrapper : IXmlSerializable
{

    public static XmlQualifiedName GetSchema(XmlSchemaSet xs)
    {           
        return XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).QualifiedName;
    }

    // implicit to/from string
    public static implicit operator string(CDataWrapper value)
    {
        return value == null ? null : value.Value;
    }

    public static implicit operator CDataWrapper(string value)
    {
        return value == null
                   ? null
                   : new CDataWrapper
                         {
                             Value =
                                 value
                         };
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {            
        return null;
    }

    // "" => <Node/>
    // "Foo" => <Node><![CDATA[Foo]]></Node>
    public void WriteXml(XmlWriter writer)
    {
        if (!string.IsNullOrEmpty(Value))
        {
            writer.WriteCData(Value);
        }
    }

    // <Node/> => ""
    // <Node></Node> => ""
    // <Node>Foo</Node> => "Foo"
    // <Node><![CDATA[Foo]]></Node> => "Foo"
    public void ReadXml(XmlReader reader)
    {
        if (reader.IsEmptyElement)
        {
            Value = "";
        }
        else
        {
            reader.Read();
            switch (reader.NodeType)
            {
                case XmlNodeType.EndElement:
                    Value = ""; // empty after all...
                    break;
                case XmlNodeType.Text:
                case XmlNodeType.CDATA:
                    Value = reader.ReadContentAsString();
                    break;
                default:
                    throw new InvalidOperationException("Expected text or CData but was: "+ reader.NodeType);

            }
        }
    }

    // underlying value
    public string Value { get; set; }

    public override string ToString()
    {
        return Value;
    }
}

CDataWrapper类被from this question。我们正在使用它,因为我们的一个客户端(FLEX客户端)无法正确读取前导\尾随空格。我们让它看起来像架构中的字符串,以免与我们的其他客户断开合同。这通常很好用,但是我们的一个客户端无法使用WCF为使用上述包装类的服务创建的模式生成代理。我们在wsdl中找到了这一行的原因:

<xsd:import schemaLocation="http://my.services.com/service/mex?xsd=xsd4" /> 

其内容是:

  <?xml version="1.0" encoding="utf-8" ?> 
- <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="string" nillable="true" type="xs:string" /> 
  </xs:schema>

问题是上面的xsd:import元素上没有namespace属性,而且我们客户端的代理生成器无法很好地处理。

简而言之,我们如何将namespace属性添加到生成的wsdl?

1 个答案:

答案 0 :(得分:1)

此信息是(正常)冗余,因为导入的xsd的targetnamespace也在此XSD中定义:

<xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/XMLSchema">

如果无法修改代理生成器,是否可以选择预处理主wsdl并在主wsdl中插入targetnamspace?

如果这不是一个选项,article可能对您有帮助。

如果这仍然不是解决方案,您可以尝试将wsdl全部展开并使用此WSDLFlattener删除xsd:imports