带字符串数组参数的XMLDP查询-报表生成器

带字符串数组参数的XMLDP查询-报表生成器,xml,soap,reporting-services,ssrs-2008,reportbuilder,Xml,Soap,Reporting Services,Ssrs 2008,Reportbuilder,我在报告中有一个XML数据源,指向我的一个C web服务。我不知道如何在查询中将字符串数组作为参数值正确地传递给该数据源 <Query> <Method Name="MyAwesomeMethod" Namespace="http://myawesomenamespace"> <Parameters> <Parameter Name="regularParameter" Type="String"> <

我在报告中有一个XML数据源,指向我的一个C web服务。我不知道如何在查询中将字符串数组作为参数值正确地传递给该数据源

<Query>
   <Method Name="MyAwesomeMethod" Namespace="http://myawesomenamespace">
   <Parameters>
      <Parameter Name="regularParameter" Type="String">
         <DefaultValue>a normal string value</DefaultValue>
      </Parameter>
      <Parameter Name="fields">
         <DefaultValue><!-- what to put here? --></DefaultValue>
      </Parameter>
   </Parameters>
   </Method>
   <ElementPath IgnoreNamespaces="true">*</ElementPath>
</Query>
在常规SOAP请求中,我会有以下内容:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mynamespace="http://myawesomenamespace">
   <soapenv:Header/>
   <soapenv:Body>
      <mynamespace:MyAwesomeMethod>
         <mynamespace:regularParameter>a normal string value</mynamespace:regularParameter>
         <mynamespace:fields>
            <mynamespace:string>value the first</mynamespace:string>
            <mynamespace:string>value the second</mynamespace:string>
         </mynamespace:fields>
      </mynamespace:MyAwesomeMethod>
   </soapenv:Body>
</soapenv:Envelope>
My web service提供了一个示例SOAP 1.1请求:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <MyAwesomeMethod xmlns="http://myawesomenamespace">
      <regularParameter>string</regularParameter>
      <fields>
        <string>string</string>
        <string>string</string>
      </fields>
    </MyAwesomeMethod>
  </soap:Body>
</soap:Envelope>

那么,如何在XMLDP查询参数中传递字符串数组作为默认值呢?这与相关,但不相同。

由于我控制web服务代码,因此解决方法是更改web方法,使它们只接受简单的参数,如字符串字段而不是字符串[]字段。然后,我使用新的Regex@[0-9a-zA-Z]+,\s*[0-9a-zA-Z]+*来确保传递了以逗号分隔的字段列表和字段。Split','。Selectstr=>str.Trim.ToArray以获得我想要的字符串[]


这是可行的,但似乎很愚蠢,因为肯定存在某种语法,允许将字符串数组传递给报表生成器中的XMLWeb服务。当然,如果我不能更改web服务,这种解决方法将毫无帮助。

简单类型的数组表示方式与它们在.NET中序列化的方式相同

您可以使用以下代码查看序列化:

string[] example = new string[] {"One", "Two", "Three"};
string serializedExample = null;
XmlSerializer serializer = new XmlSerializer(typeof(string[]));

using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, example);
    serializedExample = writer.ToString();
}

Console.WriteLine(serializedExample);
该代码生成以下输出:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>One</string>
  <string>Two</string>
  <string>Three</string>
</ArrayOfString>
如果不起作用,请尝试删除ArrayOfString标记。重要的一点是参数类型必须是Xml

<Query>
   <Method Name="MyAwesomeMethod" Namespace="http://myawesomenamespace">
   <Parameters>
      <Parameter Name="regularParameter" Type="String">
         <DefaultValue>a normal string value</DefaultValue>
      </Parameter>
      <Parameter Name="fields" Type="Xml">
         <DefaultValue><ArrayOfString><string>One</string><string>Two</string><string>Three</string></ArrayOfString></DefaultValue>
      </Parameter>
   </Parameters>
   </Method>
   <ElementPath IgnoreNamespaces="true">*</ElementPath>
</Query>