WedX - журнал о программировании и компьютерных науках

Как я могу перебрать все узлы в XML - Sql2008

Как я могу перебирать все узлы в XML-документе с помощью T-SQL (SQL2008). Мне нужно создать схемы таблиц для каждого отдельного пути к узлу (элементов) в документе.

declare @x xml='
<logins>
  <roles>
    <role name="Administrator" />
    <role name="elUser" />
    <role name="ElAdministrator"/>
    <role name="regionalManager" />
    <role name="Rep"/>
    <role name="DiscountAdministrator" />
    <role name="LoginAdmin"/>
    <groups>
      <group name="Administrators">
        <role name="Administrator"/>
        <role name="elUser" />
        <role name="ElAdministrator" />
        <role name="Rep" />
        <role name="regionalManager" />
        <role name="DiscountAdministrator" />
        <role name="LoginAdmin" />
      </group>
    </groups>
  </roles>
  <members>
    <member login="apeiris" ofgroup="Administrator"></member>
  </members>
</logins>'

Отредактировано, чтобы включить выше, я думаю об общем скрипте для создания/обслуживания схемы, что означает, что я не знаю узлов заранее.


  • Взгляните на Как я могу получить список имен элементов из XML. В противном случае вопрос неясен в том, чего вы пытаетесь достичь 15.03.2011
  • Разве вам не нужно в какой-то момент знать, что вы собираетесь делать с данными, которые вы экстраполируете? Например, вам нужно знать, что вы добавляете роли, если путь /logins/roles/role... 15.03.2011
  • @ Ричард, именно то, что я искал. Большое спасибо .. 15.03.2011

Ответы:


1

Следующий код можно использовать для сопоставления всей структуры xml и значений, хранящихся в документе, из которого мы знаем только имя его корня.

Когда я тестировал его, он работал всего несколько раз, после чего он высасывал слишком много ресурсов sql, и несвязанные транзакции начали страдать.

Я пытался найти способы заставить его работать с функцией nodes(), но только старый OPENXML делал то, что мне было нужно.

Затем я вставил его в переменные таблицы и манипулировал им.

Для этого конкретного вопроса может быть сгенерирован динамический sql, чтобы проверить, существуют ли необходимые таблицы или нет, и после их создания, если необходимо, продолжить вставку значений.

DECLARE @idoc INT
DECLARE @param_XML XML = 
'<root>
    <element1>hello
        <element2>1</element2>
        <element3 id="3">goodbye</element3>
    </element1>
</root>'

EXEC sys.sp_xml_preparedocument @idoc OUTPUT, @param_XML


--SELECT id, parentid, nodetype,localname, prev, [text]
SELECT *
FROM OPENXML (@idoc, '/root', 2)

-- remeber to close document to avoid memory leak
EXEC sys.sp_xml_removedocument @idoc
18.02.2012

2

Если структура остается такой же, как вы опубликовали, вам не нужно беспокоиться о добавлении дополнительных ролей.

попробуй это:

declare @x xml='
<logins>
<roles>
<role name="Administrator" />
<role name="elUser" />
<role name="ElAdministrator"/>
<role name="regionalManager" />
<role name="Rep"/>
<role name="DiscountAdministrator" />
<role name="LoginAdmin"/>
<groups>
  <group name="Administrators">
    <role name="Administrator"/>
    <role name="elUser" />
    <role name="ElAdministrator" />
    <role name="Rep" />
    <role name="regionalManager" />
    <role name="DiscountAdministrator" />
    <role name="LoginAdmin" />
  </group>
</groups>
    <groups>
  <group name="SimpleUser">
    <role name="Administrator"/>
    <role name="elUser" />
    <role name="ElAdministrator" />
    <role name="Rep" />
    <role name="regionalManager" />
    <role name="DiscountAdministrator" />
    <role name="LoginAdmin" />
  </group>
</groups>
</roles>
<members>
<member login="apeiris" ofgroup="Administrator"></member>
</members>
</logins>'

select 
row_number() over (partition by 
t.x.value('(group/@name)[1]' , 'varchar(100)') 
order by t.x.value('(group/@name)[1]' , 'varchar(100)')) Id,
t.x.value('(group/@name)[1]' , 'varchar(100)') GroupName,
p.y.value('@name' , 'varchar(100)') RoleName
from @x.nodes('//logins/roles/role') p(y)
cross apply @x.nodes('//groups') t(x)

Он предоставляет все роли и группы в xml

25.10.2013

3

Я почти уверен, что если вы знаете, какие узлы будут таблицами, вы можете использовать статус XPath... У вас есть образец файла?

Это дает мне все 7 ваших ролевых имен:

SELECT      Logins.L.query('data(@name)').value('.', 'varchar(60)') as RoleName
FROM        @x.nodes('/logins/roles/role') Logins (L)

Отсюда вы можете использовать ту же идею, чтобы получить необходимые данные и выполнить любой SQL на основе результатов SELECT, как бы вы ни выбрали.

14.03.2011
  • Виновный по обвинению, я не заметил, что к вопросу добавили определитель в самом конце... 16.03.2011
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]