-->

在SQL Server中删除空的XML标记的不同水平(Remove Varying levels o

2019-10-20 20:10发布

我使用FOR XML EXPLICIT工会将一些SQL表信息到一个XML文件中。 这是所有的工作,但我的成绩空标签的负荷,在各种不同层次的。 我想删除所有的空标签,但保持各组的最高级别。 下面是诸如此类的事情,我的意思是一个例子:

使用XML废话的这个例子位,我可以删除底层用.modify的XQuery空节点:

DECLARE @XML XML = 
'<Whatever>
  <GlassesTypes>
      <GlassesType />
  </GlassesTypes>
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights>
    <Flight>
      <Bookings>
        <Booking>
          <Segments>
            <Segment />
          </Segments>
        </Booking>
      </Bookings>
    </Flight>
  </Flights>
</Whatever>'

SELECT @XML as Before

SET  @Xml.modify('delete //*[not(node())]');

SELECT @XML AS After

这已经做了什么我想“GlassesTypes”,但仍有空节点的水平,“机票”。 我可以重复同样的一遍又一遍,每个级别的起床只有“机票”显示点修改命令,但是这样做会删除“GlassesTypes”空的占位符:

DECLARE @XML XML = 
'<Whatever>
  <GlassesTypes>
      <GlassesType />
  </GlassesTypes>
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights>
    <Flight>
      <Bookings>
        <Booking>
          <Segments>
            <Segment />
          </Segments>
        </Booking>
      </Bookings>
    </Flight>
  </Flights>
</Whatever>'

SELECT @XML as Before

SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');

SELECT @XML AS After

有没有什么办法中,我可以删除所有空节点,直到倒数第二个空节点,无论一组多少级包含? 理想的结果是这样的:

<Whatever>
  <GlassesTypes />
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights />
</Whatever>

在这个例子中,只有“不管”的标签,但在真实的数据,可能会有几个反复,所有不同层次的信息,由根标签或同等包围。

任何帮助非常感谢!

谢谢,马克

Answer 1:

您可以定义的“空”版本不包含任何后代属性或文本节点,而不是作为不包含任何后代节点。 然后保留的儿童<Whatever>只选择其子女的后代:

/Whatever/*//*[empty(.//text() | .//attribute())]


文章来源: Remove Varying levels of empty XML tags in SQL Server