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

时间:2012-04-12 22:47:04

标签: xml soap reporting-services ssrs-2008 reportbuilder

我在报告中有一个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>

我的Web服务提供了一个示例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查询参数中的默认值传递?这与my other question有关,但不相同。

2 个答案:

答案 0 :(得分:0)

由于我控制了Web服务代码,解决方法是更改​​我的Web方法,因此它们只采用简单的参数,例如string fields而不是string[] fields。然后我使用new Regex(@"([0-9a-zA-Z]+)(,\s*[0-9a-zA-Z]+)*")来确保传递逗号分隔的字段列表,并使用fields.Split(',').Select(str => str.Trim()).ToArray()来获得我想要的string[]

这很有效,但它似乎很愚蠢,因为肯定存在一些语法,允许将字符串数组传递给Report Builder中的XML Web服务。当然,如果我无法更改Web服务,这种解决方法根本无济于事。

答案 1 :(得分:0)

简单类型的数组的表示方式与它们在.NET中使用XmlSerializer Class进行序列化的方式相同。

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

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>

将此作为参数展示时,请忽略<?xml version="1.0" encoding="utf-16"?>。您也可以省略xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"而不会产生任何不良影响。

这应该给你:

<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>

如果不起作用,请尝试删除ArrayOfString标记。重要的是你的参数类型必须是Xml。