Исключить внука из XML с помощью XPath - PullRequest
2 голосов
/ 09 июля 2020

Попытка исключить указанного c внука при чтении структуры XML с использованием SQL Server 2017.

У меня есть пример структуры:

<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild3"/>
            <c id = "grandchild4"/>
        </b>
    </a>
</root>

I может исключить указанный c дочерний элемент, используя c[not(contains(@id,"grandchild3"))], когда я перехожу, например, к узлу <b id = "child2">.

Но как мне исключить этот конкретный c внук при обработке остальной части XML из узла root?

То, что я хотел бы получить, чтобы я мог записать его в файл, имеет такую ​​структуру:

<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild4"/>
        </b>
    </a>
</root>

Как видно grandchild3 теперь отсутствует в этой структуре.

1 Ответ

3 голосов
/ 09 июля 2020

Выполнение этого в SELECT на удивление сложно, но, к счастью, вам это не нужно. Вы можете сделать копию своего xml, изменить его с помощью .modify, а затем использовать это:

declare @original xml = '<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild3"/>
            <c id = "grandchild4"/>
        </b>
    </a>
</root>'

declare @new xml = @original

set @new.modify('delete //c[@id="grandchild3"]')

select @new

дает

<root>
  <a id="parent">
    <b id="child1">
      <c id="grandchild1" />
      <c id="grandchild2" />
    </b>
    <b id="child2">
      <c id="grandchild4" />
    </b>
  </a>
</root>

по желанию.

Xpath //c[@id="grandchild3"] означает «Любой узел c (в любом месте документа) с атрибутом id со значением grandchild3».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...