ASP -> Coldfusion Webservice XML - PullRequest
       7

ASP -> Coldfusion Webservice XML

1 голос
/ 13 декабря 2010

Я получаю следующий XML от веб-службы ASP-NET (это заняло у меня 3 дня).Но поскольку я такой кусочек XML, я не знаю, как его отформатировать в базовую таблицу отображения.Мне нужно, чтобы он был в Coldfusion, потому что это все, что я понимаю, и мой сайт - CF-сайт.Он использует diffgram, о котором я тоже ничего не знаю.Но я готов учиться!

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        <BillingResponse xmlns="http://portal/customer.asmx">       
            <BillingResult>
                <xs:schema id="NewDataSet" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                    <xs:element msdata:IsDataSet="true" msdata:UseCurrentLocale="true" name="NewDataSet">
                        <xs:complexType>
                            <xs:choice maxOccurs="unbounded" minOccurs="0">
                                <xs:element name="Table">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element minOccurs="0" name="CustomerCode" type="xs:int"/>
                                            <xs:element minOccurs="0" name="ServiceCode" type="xs:int"/>
                                            <xs:element minOccurs="0" name="SubscriberCode" type="xs:string"/>
                                            <xs:element minOccurs="0" name="Status" type="xs:string"/>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>

                <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

                    <NewDataSet xmlns="">
                        <Table diffgr:id="Table1" msdata:rowOrder="0">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>0</ServiceCode>
                            <SubscriberCode/>
                            <Status/>
                        </Table>
                        <Table diffgr:id="Table2" msdata:rowOrder="1">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>2</ServiceCode>
                            <SubscriberCode>95205292</SubscriberCode>
                            <Status>OPEN</Status>
                        </Table>
                        <Table diffgr:id="Table3" msdata:rowOrder="2">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>8</ServiceCode>
                            <SubscriberCode>dageorgetti</SubscriberCode>
                            <Status>1</Status>
                        </Table>
                        <Table diffgr:id="Table4" msdata:rowOrder="3">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>16</ServiceCode>
                            <SubscriberCode>NTL00711</SubscriberCode>
                            <Status>CLOSED</Status>
                        </Table>
                        <Table diffgr:id="Table5" msdata:rowOrder="4">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>16</ServiceCode>
                            <SubscriberCode>95205292</SubscriberCode>
                            <Status>CLOSED</Status>
                        </Table>
                        <Table diffgr:id="Table6" msdata:rowOrder="5">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>16</ServiceCode>
                            <SubscriberCode>95205292</SubscriberCode>
                            <Status>OPEN</Status>
                        </Table>
                        <Table diffgr:id="Table7" msdata:rowOrder="6">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>4096</ServiceCode>
                            <SubscriberCode>64280452637</SubscriberCode>
                            <Status>OPEN</Status>
                        </Table>
                        <Table diffgr:id="Table8" msdata:rowOrder="7">
                            <CustomerCode>1114309</CustomerCode>
                            <ServiceCode>4096</ServiceCode>
                            <SubscriberCode>64280426643</SubscriberCode>
                            <Status>OPEN</Status>
                        </Table>
                    </NewDataSet>
                </diffgr:diffgram>
            </BillingResult>
        </BillingResponse>
    </soap:Body>
</soap:Envelope>

Любой фрагмент кода или помощь в этом ужасном шоу будет принята с благодарностью

1 Ответ

3 голосов
/ 13 декабря 2010

Обычно при использовании веб-службы SOAP от ColdFusion вы используете <cfinvoke>, и все возвращается в исходном формате.

Однако, особенно при использовании ASPВеб-сервисы .NET ASMX, я обнаружил, что возвращенный XML и парсер ColdFusion не всегда играют хорошо;поэтому я склонен выполнять обработку вручную.

Этот код взят из метода, который я написал для вызова API.Сначала сделайте HTTP-запрос вручную:

<cftry>
    <cfhttp
        url="#wsLocation#"
        result="local.wsResult"
        method="post"
        timeout="#variables.timeout#"
        throwonerror="true"
    >
        <cfhttpparam type="formfield" name="inputName" value="inputValue" />
        <cfhttpparam type="formfield" name="inputName" value="inputValue" />
        <cfhttpparam type="formfield" name="inputName" value="inputValue" />
    </cfhttp>

Затем проверьте наличие общих ошибок: (вы можете столкнуться с некоторыми из них / все-из-за-ничего-больше)

    <cfif trim(local.wsResult.fileContent) eq "Connection Timeout">
        <cfthrow message="Request timeout while connecting to .Net API" detail="#local.wsResult.statusCode#" />
    </cfif>
    <cfif not isXML(local.wsResult.FileContent)>
        <cfthrow message="ASP.NET WS did not return valid XML." detail="#local.wsResult.FileContent#" />
    </cfif>

Затем проанализируйте возвращенный xml и верните только ту часть, которая вас интересует:

    <cfset local.wsResponse = xmlParse(local.wsResult.Filecontent) />
    <cfset local.rspContainer = local.wsResponse['soap:envelope']['soap:body'].BillingResponse.BillingResult />

    <cfcatch>
        <cfset local.arguments = arguments />
        <cfset errorEmail(cfcatch, local) />
        <cfreturn "" />
    </cfcatch>
</cftry>
<cfreturn local.rspContainer />

Это вернет узел <BillingResponse> и все, что внутри него.

Затем вам нужно разобрать это для данных, которые вам нужны.Вы можете сделать это с помощью выражений XPath и функции XMLSearch, или, если данные просты, просто захватите их вручную.

DiffGram xml, на который вы ссылаетесь, вероятно, потому что вы возвращаетеобъект DataTable в вашем .Net коде.Вот как я справляюсь с этим в ColdFusion:

dataContainer = apiRequest(whatever); //calls the method above

Сначала убедитесь, что есть дочерние элементы для получения:

local.emptySet = QueryNew("GivenName,Surname,FileAs,CompanyName");
if (not structKeyExists(local.dataContainer, "DocumentElement")){ return local.emptySet; }
//emptySet is whatever object you're converting the xml into, only with no data, so 
//maybe an empty query or structure or something.

Затем получите массив дочерних элементов:

local.items = local.dataContainer.DocumentElement.XmlChildren;

В моем случае я создаю запрос, поэтому я добавляю в запрос достаточное количество строк для хранения всех данных:

//create enough rows in the query to store the contact data
QueryAddRow(local.emptySet, arrayLen(local.items));

Затем зацикливаем каждый узел в массиве дочерних элементов,копирование значения в запрос.Переменная local.fieldList представляет собой список узлов xml внутри каждой строки в вашей DataTable, и она будет использовать список для получения каждого поля.Внешний цикл выполняет итерацию по строкам в DataTable, а внутренний цикл выполняет итерацию по столбцам в строке.Я много вычеркнул из своего списка, чтобы сохранить код относительно небольшим, но проблем с его увеличением не возникает.

//popuplate the query
for (local.i = 1; local.i lte arrayLen(local.items); local.i = local.i + 1){
    local.fieldList = "GivenName,Surname,FileAs,CompanyName";
    for (local.j = 1; local.j lte listLen(local.fieldList); local.j = local.j + 1){
        local.key = listGetAt(local.fieldList, local.j);
        if (structKeyExists(local.items[local.i], local.key)){
            QuerySetCell(local.emptySet, local.key, local.items[local.i][local.key].XmlText, local.i);
        }
    }
}
return local.emptySet;

О, и это также предполагает, что имена полей в вашем DataTable являютсяточно так же, как имена столбцов в запросе, в который они копируются.

...