2012-04-12 55 views
0

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

<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有关,但不相同。

回答

0

解决方法,因为我控制的Web服务代码,是改变我的网络方法,所以他们只采取简单的参数,如string fields而不是string[] fields。然后我使用new Regex(@"([0-9a-zA-Z]+)(,\s*[0-9a-zA-Z]+)*")来确保通过逗号分隔的字段列表,并且fields.Split(',').Select(str => str.Trim()).ToArray()可以像我想要的那样获得string[]

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

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。