Нужна помощь с записью из XML в базу данных SQL Server (подробно) - PullRequest
1 голос
/ 01 июня 2010

Я новичок в XML и веб-сервисах и тому подобное.

Я работаю над проектом, использующим GlassFish OpenESB для планирования процесса получения некоторой информации из веб-сервиса и последующего сохранения в базе данных.

Критерии в основном таковы, что мне нужно использовать модули GlassFish OpenESB или EJB, где я могу предоставлять веб-сервисы или что-то в этом роде, И я должен использовать SQL Server 2005.

До сих пор я был в состоянии поговорить с веб-сервисом: и получить что-то в этом духе

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <m:entrypoint_getSettlementsOperationResponse xmlns:m="http://j2ee.netbeans.org/wsdl/BorgunTestBPEL/entrypoint_getSettlements">
      <part1>
        <GetSettlementsByMerchantResponse xmlns="http://Borgun.Services.Gateway/2010/04/Settlement">
          <GetSettlementsByMerchantResult xmlns:a="http://schemas.datacontract.org/2004/07/Borgun.Library.Common" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:msgns="http://Borgun.Services.Gateway/2010/04/Settlement" xmlns:ns0="http://j2ee.netbeans.org/wsdl/BorgunTestBPEL/entrypoint_getSettlements">
            <a:CreditCardSettlement>
              <a:amexAmount>XXX</a:amexAmount>
              <a:amount>XXXX</a:amount>
              <a:batches>
                <a:CreditCardBatch>
                  <a:batchdate>xxx</a:batchdate>
                  <a:batchnumber>XXXX</a:batchnumber>
                  <a:currencyCode>xxxx</a:currencyCode>
                  <a:merchantnumber>xxxx</a:merchantnumber>
                  <a:settlementRunNumber>xx4</a:settlementRunNumber>
                  <a:settlementdate>2010-04-06T00:00:00</a:settlementdate>
                  <a:slips>2</a:slips>
                  <a:sum>xxxx</a:sum>
                </a:CreditCardBatch>
                <a:CreditCardBatch>
                  <a:batchdate>xxx</a:batchdate>
                  <a:batchnumber>xxxxx</a:batchnumber>
                  <a:currencyCode>xxxx</a:currencyCode>
                  <a:merchantnumber>xxxx</a:merchantnumber>
                  <a:settlementRunNumber>xxxx</a:settlementRunNumber>
                  <a:settlementdate>xxxx</a:settlementdate>
                  <a:slips>x</a:slips>
                  <a:sum>xxx</a:sum>
                </a:CreditCardBatch>
              </a:batches>
              <a:commission>xx</a:commission>
              <a:currencyCode>xxx</a:currencyCode>
              <a:deduction>-xxx</a:deduction>
              <a:deductionItems>
                <a:CrediCardSettlementDeduction>
                  <a:amount>-xxx</a:amount>
                  <a:code>VIÐSKF</a:code>
                  <a:currencyCode>ISK</a:currencyCode>
                  <a:merchantnumber>xxx</a:merchantnumber>
                  <a:settlementrunnumber>xxx</a:settlementrunnumber>
                  <a:text>Afsláttur v/ekorta</a:text>
                </a:CrediCardSettlementDeduction>
                <a:CrediCardSettlementDeduction>
                  <a:amount>-335.00</a:amount>
                  <a:code>ÁLAGKREK</a:code>
                  <a:currencyCode>ISK</a:currencyCode>
                  <a:merchantnumber>xxx</a:merchantnumber>
                  <a:settlementrunnumber>xxx</a:settlementrunnumber>
                  <a:text>xxx</a:text>
                </a:CrediCardSettlementDeduction>
              </a:deductionItems>
            </a:CreditCardSettlement>
          </GetSettlementsByMerchantResult>
        </GetSettlementsByMerchantResponse>
      </part1>
    </m:entrypoint_getSettlementsOperationResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

У меня есть доступ к серверу SQL Server 2005, который является удаленным, и я знаю, что могу вставить в него, но, учитывая, что теперь у меня есть отношение «один ко многим», я хочу иметь возможность выполнить откат в случае сбоя.

Итак, вкратце, как я могу вставить этот XML-файл в БД, желательно не проходя вручную через дерево XML?

Я почти уверен, что должен использовать Entity и Session Beans или, возможно, привязки JAXB, но я просто не добился успеха.

Одна из причин может быть связана с тем, что мыльный ответ содержит массив CreditCardSettlements, каждый из которых содержит массив Batches и DeductionItems

Было бы лучше, если бы кто-нибудь мог помочь мне сделать это через BPEL в GlassFish OpenESB, но любой намек на решение Java очень ценится.

1 Ответ

0 голосов
/ 14 июня 2010

вы захотите использовать JAXB. найдите инструмент xjc в / bin (он должен быть уже в вашем пути, затем используйте его в схеме на http://schemas.xmlsoap.org/soap/envelope/., сначала вы должны загрузить схему, а затем запустить
xjc -d <directory> <schema-name>
каталог должен быть исходной папкой (например, src), а имя схемы - это имя файла, куда вы скачали схему. это сгенерирует кучу исходных файлов, которые соответствуют схеме. затем вы можете использовать инструмент JAXB Unmarshaller следующим образом:
JAXBContext ctx = JAXBContext.newInstance(Envelope.class.getPackage().getName();<br> Unmarshaller u = ctx.createUnmarshaller();<br> JAXBElement<Envelope> root = (JAXBElement<Envelope>) u.unmarshall(xmlStr);<br> Envelope envelope = root.getValue();

конверт будет представлять собой корень структуры данных, которую вам как-то придется записывать в SQL (ответ на этот вопрос я не знаю). xmlStr должен быть StringBuffer с содержимым xml. документы для JAXB находятся по адресу java.sun.com/javase/6/docs/api/javax/xml/bind/package-summary.html

...