Próbuję przejść z SQL do XML, ale muszę to poprawnie sformatować, inaczej to nie zadziała. Używam C # do wstawiania mojego sql między QBXML

select employee_name as Name ,'OCI Associates' as [CompanyName],'Mr' as Salutation ,
 LEFT(employee_name,CHARINDEX(' ',employee_name + ' ')-1) as FirstName,  REVERSE(LEFT(REVERSE(employee_name),
CHARINDEX(' ',REVERSE(employee_name))- 1)) AS LastName


  from EMPLOYEELIST 
for xml raw('CustomerAdd') , ROOT('CustomerAddRq'), ELEMENTS

Oto, co dostaję

<CustomerAdd>
        <Name>Zohreh FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Zohreh</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>
      <CustomerAdd>
        <Name>Phillip FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Phillip</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>

To jest to, czego potrzebuję

'' '

 <CustomerAddRq>
<CustomerAdd>
        <Name>Zohreh FAKELASTNAME</Name>
        <Salutation>Mr</Salutation>
        <FirstName>Zohreh</FirstName>
        <LastName>FAKELASTNAME</LastName>
      </CustomerAdd>
 </CustomerAddRq>
 <CustomerAddRq>
  <CustomerAdd>
    <Name>Phillip FAKELASTNAME</Name>
    <Salutation>Mr</Salutation>
    <FirstName>Phillip</FirstName>
    <LastName>FAKELASTNAME</LastName>
  </CustomerAdd>

'' '

Nie wiem, jak dodać „CustomerAddRq” do każdego „CustomerAdd”

0
Corey Gashlin 19 grudzień 2019, 23:41

2 odpowiedzi

Wypróbuj xml linq. Wziąłem tablicę ciągów elementów, które, jak zakładam, pochodziły z bazy danych, a następnie dodałem do węzła głównego.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] xmlArray = {
                                    "<CustomerAdd>" +
                                      "<Name>Zohreh FAKELASTNAME</Name>" +
                                      "<Salutation>Mr</Salutation>" +
                                      "<FirstName>Zohreh</FirstName>" +
                                      "<LastName>FAKELASTNAME</LastName>" +
                                    "</CustomerAdd>",
                                    "<CustomerAdd>" +
                                      "<Name>Phillip FAKELASTNAME</Name>" +
                                      "<Salutation>Mr</Salutation>" +
                                      "<FirstName>Phillip</FirstName>" +
                                      "<LastName>FAKELASTNAME</LastName>" +
                                    "</CustomerAdd>"
                                };
            XElement customerAddRq = new XElement("CustomerAddRq");
            customerAddRq.Add(xmlArray.Select(x => XElement.Parse(x)));
        }
    }
}
0
jdweng 20 grudzień 2019, 00:29

Proszę - w przypadku następnego pytania - zawsze oznaczaj swoim aktualnym RDBMS (dostawcą i wersją). Oznaczyłeś tagiem [sql], co nie wystarczy...

Z twojego kodu zakładam, że to jest SQL Server.

Możesz spróbować tego:

Utwórz tablicę makiety, aby zasymulować swój problem (zrób to sam następnym razem)

DECLARE @fakeTable TABLE(employee_name VARCHAR(100), salutation VARCHAR(50));
INSERT INTO @fakeTable VALUES
 ('Zohreh FAKELASTNAME','Mr')
,('One MORE','Ms')

--Twoje własne zapytanie, nieznacznie zmienione

select employee_name as [CustomerAdd/Name] 
      ,'OCI Associates' as [CustomerAdd/CompanyName]
      , salutation as [CustomerAdd/Salutation]
      , LEFT(employee_name,CHARINDEX(' ',employee_name + ' ')-1) as [CustomerAdd/FirstName]
      ,  REVERSE(LEFT(REVERSE(employee_name),CHARINDEX(' ',REVERSE(employee_name))- 1)) AS [CustomerAdd/LastName]
from @fakeTable EMPLOYEELIST 
for xml PATH('CustomerAddRq');

Pomysł w skrócie:

Używam trybu PATH. Pozwala to na wyrażenie XPath w aliasie kolumny.
ROOT będzie najbardziej zewnętrznym elementem, pojawiającym się tylko raz. Nazwa po PATH('ThisName') pojawi się wokół każdego wiersza.
Teraz nadchodzi magia:

  • Wyszukiwarka otwiera tag wiersza i znajduje element jako [CustomerAdd/Name].
  • Zapisze tag otwierający <CustomerAdd>, a następnie tag otwierający <Name>.
  • W tym elemencie zapisze zawartość jako węzeł text().
  • Teraz silnik znajduje <CustomerAdd/CompanyName>.
  • Silnik zamknie się <Name>, ale – nadal w ciągu <CustomerAdd> – będzie kontynuowany tutaj i otworzy <CompanyName>
  • ...i tak dalej...
0
Shnugo 20 grudzień 2019, 10:54