Разбор XML с пространством имен по умолчанию с использованием T-SQL - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий формат, который мне нужен, чтобы получить мой формат XML при использовании SSMS

<ESBTimecardLoad xmlns="http://test.com/schemas">
      <Initialize xmlns="http://test.com/schemas">
            <Add>
                  <TimeCard>
                        <Attributes>
                              <Timekeeper AliasField="Number">C1235</Timekeeper>
                              <WorkDate>5/11/2018</WorkDate>
                              <WorkHrs>1.50</WorkHrs>
                              <Matter AliasField="Number">04420.3004</Matter>
                              <WorkType>Admin</WorkType>
                              <Phase AliasField="Code">rty</Phase>
                              <Task AliasField="Code">QEW</Task>
                              <Activity AliasField="Code">TTT</Activity>                  
                        </Attributes>
                  </TimeCardPending>
            </Add>
            <Add>
                  <TimeCardPending>
                        <Attributes>
                              <Timekeeper AliasField="Number">C888888</Timekeeper>
                              <WorkDate>7/6/2017</WorkDate>
                              <WorkHrs>0.25</WorkHrs>
                              <Matter AliasField="Number">01594.1009</Matter>
                              <WorkType>Enterprise</WorkType>
                              <Phase AliasField="Code">P3</Phase>
                              <Task AliasField="Code">QWE</Task>
                              <Activity AliasField="Code">YYY</Activity>
                        </Attributes>
                  </TimeCardPending>
            </Add>
</Start>
</TimecardLoad>

У меня есть следующий запрос, чтобы получить XML.Обратите внимание, что Add, Timecard и атрибуты повторяются для каждой записи.Можно ли сгруппировать 3 тега вместе для каждой записи?У меня проблемы с созданием повторяющихся группировок и раздела Aliasfield для каждой записи.

WITH XMLNAMESPACES (DEFAULT 'http://Test.com/schemas') 
   SELECT
       CAST ((SELECT TOP 2 
                  [Team] "Timekeeper", 
                  [Date] "WorkDate",
                  [WorkHrs],
                  [Matter] "Matter",
                  [WorkType] "WorkType",
                  [Phase], [task],
                  [Activity], [Notes] AS Narrative    
              FROM
                  view_review     
              FOR XML PATH('Attributes'), ROOT('Initialize')) AS XML)
FOR XML PATH('TimeCardLoad'), ELEMENTS

Это мой результат:

<ESBTimeCardLoad xmlns="http://test.com/schemas">
  <Initialize xmlns="http://test.com/schemas">
    <Attributes>
      <Timekeeper>TEster, Monica</Timekeeper>
      <WorkDate>05/25/15</WorkDate>
      <WorkHrs>10.00</WorkHrs>
      <Phase>P3</Phase>
      <task>P3_Fsol</task>
      <Activity>SETUPS3</Activity>
    </Attributes>
    <Attributes>
      <Timekeeper>Mob, JOhn</Timekeeper>
      <WorkDate>05/27/15</WorkDate>
      <WorkHrs>8.00</WorkHrs>
      <Phase>P3</Phase>
      <task>P3_Fsol</task>
      <Activity>SETUPS3</Activity>
    </Attributes>
  </Initialize>
</ESBTimeCardLoad>

Каким образом мне следует изменить запрос?

1 Ответ

0 голосов
/ 04 июня 2018

XML, который вы показываете нам как формат, который мне нужен, чтобы получить мой XML , не очень корректен во многих отношениях:

  • Вы открываете с <ESBTimecardLoad><Initialize>, но заканчиваетес </Start></TimecardLoad>
  • В течение первого <Add> вы открываете с помощью <TimeCard>, но заканчиваете <TimeCardPending>
  • , вы не должны использовать культурно-зависимый формат для ваших дат.5/11/2018 можно принять за 5 ноября или 11 мая ...

Ниже будут показаны принципы с некоторыми из ваших столбцов,Проверьте это.

DECLARE @tbl TABLE(ID INT IDENTITY, TimeKeeper VARCHAR(100),WorkDate DATE, WorkHrs DECIMAL(6,2), Matter VARCHAR(100));
INSERT INTO @tbl VALUES
 ('C1235','2018-11-05',1.5,04420.3004)
,('C8888','2017-06-07',0.25,01594.1009);

WITH XMLNAMESPACES (DEFAULT 'http://Test.com/schemas') 
SELECT
(
    SELECT 'Number' AS [TimeCardPending/Attributes/Timekeeper/@AliasField]
          ,TimeKeeper AS [TimeCardPending/Attributes/Timekeeper]
          ,WorkHrs AS [TimeCardPending/Attributes/WorkHrs]
          ,'Number' AS [TimeCardPending/Attributes/Matter/@AliasField]
          ,Matter AS [TimeCardPending/Attributes/Matter]
          --and so on
    FROM @tbl t
    FOR XML PATH('Add'),ROOT('Initialize'),TYPE
) AS [*]
FOR XML PATH(''),ROOT('ESBTimecardLoad');

результат

<ESBTimecardLoad xmlns="http://Test.com/schemas">
  <Initialize xmlns="http://Test.com/schemas">
    <Add>
      <TimeCardPending>
        <Attributes>
          <Timekeeper AliasField="Number">C1235</Timekeeper>
          <WorkHrs>1.50</WorkHrs>
          <Matter AliasField="Number">4420.3004</Matter>
        </Attributes>
      </TimeCardPending>
    </Add>
    <Add>
      <TimeCardPending>
        <Attributes>
          <Timekeeper AliasField="Number">C8888</Timekeeper>
          <WorkHrs>0.25</WorkHrs>
          <Matter AliasField="Number">1594.1009</Matter>
        </Attributes>
      </TimeCardPending>
    </Add>
  </Initialize>
</ESBTimecardLoad>
...