2012-04-12 7 views
0

Ich habe eine XML-Datenquelle in einem Bericht, die auf einen C# -Webdienst von mir verweist. Ich weiß nicht, wie ein Array von Zeichenfolgen als Parameterwert in einer Abfrage an diese Datenquelle übergeben wird.XMLDP-Abfrage mit String-Array-Parameter - Berichts-Generator

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

In einem regulären SOAP-Anforderung, würde ich habe folgendes:

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

Mein gibt Web-Service ein Beispiel für eine SOAP 1.1-Anforderung:

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

So wie würde ich ein Array übergeben von Zeichenfolgen als Standardwert in einem XMLDP-Abfrageparameter? Dies bezieht sich auf my other question, aber nicht dasselbe.

Antwort

0

Die Problemumgehung, da ich den Web-Service-Code zu steuern, ist, meine Web-Methoden zu ändern, so dass sie nur einfache Parameter wie string fields statt string[] fields nehmen. Dann verwende ich, um sicherzustellen, dass eine durch Kommas getrennte Feldliste übergeben wurde und fields.Split(',').Select(str => str.Trim()).ToArray(), um eine string[] wie ich wollte.

Das funktioniert, aber es scheint albern, denn sicherlich gibt es irgendwo eine Syntax, die es ermöglicht, String-Arrays an einen XML-Web-Service innerhalb von Report Builder zu übergeben. Und natürlich würde diese Problemumgehung überhaupt nicht helfen, wenn ich den Webservice nicht ändern könnte.

0

Arrays von einfachen Typen werden auf die gleiche Weise dargestellt, wie sie mit einer XmlSerializer Class in .NET serialisieren.

können Sie den Code verwenden, unter die Serialisierung zu sehen:

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

Der Code erzeugt diese Ausgabe:

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

Wenn diese als Parameter präsentiert, die <?xml version="1.0" encoding="utf-16"?> wegzulassen. Sie können auch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ohne negative Auswirkungen weglassen.

Dies sollte Ihnen:

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

Wenn das nicht funktioniert, versuchen Sie die ArrayOfString-Tags zu entfernen. Der wichtige Teil ist, dass Ihr Parametertyp Xml sein muss.