2012-04-12 6 views
0

У меня есть источник данных XML в отчете, указывающий на мой веб-сервис C#. Я не знаю, как правильно передать массив строк в качестве значения параметра в запросе к этому источнику данных.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> 

Мой веб-сервис дает образец 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

Обходной путь, поскольку я управляю кодом веб-службы, заключается в изменении моих веб-методов, поэтому они принимают только простые параметры, такие как string fields вместо string[] fields. Затем я использую new Regex(@"([0-9a-zA-Z]+)(,\s*[0-9a-zA-Z]+)*"), чтобы получить список полей, разделенных запятой, и fields.Split(',').Select(str => str.Trim()).ToArray(), чтобы получить string[], как я хотел.

Это работает, но кажется глупым, потому что, безусловно, существует какой-то синтаксис где-то, который позволяет передавать массивы строк в веб-службу XML в построителе отчетов. И, конечно, это обходное решение не помогло бы, если бы я не мог изменить веб-сервис.

0

Массивы простых типов представлены так же, как они сериализуются с помощью XmlSerializer Class в .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> 

При представлении этого в качестве параметра, опустите <?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.