2012-04-12 19 views
0

レポートにXMLデータソースがあり、C#Webサービスを参照しています。私は、そのデータソースへのクエリで、文字列の配列をパラメータ値として正しく渡す方法を知らない。文字列配列パラメータを使用したXMLDPクエリ - Report Builder

通常のSOAPリクエストで
<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> 

、私は以下を持っているでしょう:

<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のような単純なパラメータしか取らないようにWebメソッドを変更することです。次に、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である必要があることです。

関連する問題