2014-09-02 3 views
1

FOR XML EXPLICIT를 사용하여 일부 SQL 테이블 정보를 XML 파일로 변환합니다. 그것은 모두 작동하지만, 결과에 여러 종류의 다양한 레벨의 빈 태그가 있습니다. 모든 빈 태그를 제거하고 싶지만 각 그룹의 최상위 레벨을 유지하십시오. 여기 물건의 종류의 예입니다 내 말은 :SQL Server에서 빈 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 

이 행하신 정확히 I 'GlassesTypes'를 원하지만 'Flights'에는 여전히 빈 노드가 있습니다. 어떤 방법이 있나요

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 

: 나는 같은은 '행'이 표시되는 시점까지 얻을 각 수준에 대한 반복 명령을 수정 반복 할 수 있지만, 이렇게하면 'GlassesTypes'빈 자리를 삭제합니다 어떤 빈 노드를 두 개까지 삭제할 수 있습니까? 이상적인 결과는 다음과 같다 :이 예에서

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

은 단지 '무엇이든'태그가 있지만, 실제 데이터의 루트 태그에 포함되는 정보의 서로 다른 수준, 모든 반복 여러 가지가있을 수 있습니다 또는 동급.

많은 도움을 주셨습니다.

덕분에, 마크

답변

3

는 대신 같은 후손 노드를 포함하지 않는의 모든 자손 속성 또는 텍스트 노드를 포함하지 않는으로 "빈"의 버전을 정의 할 수 있습니다. 그런 다음 자녀의 자손만을 선택하여 <Whatever>의 자녀를 보유하십시오.

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

안녕하세요, 답변을 주셔서 감사합니다. 스크립트의 실제 줄이 어떻게 생겼는지 분명히 할 수 있겠 니? 미안 해요. 전에 xquery를 많이 사용하지 않았습니다. –

+0

@HighPlainsGrifter 그것은'// * [not (node ​​())] '대신'delete' 다음에 오는 XPath입니다. 이 작업은 한 번만 실행하면됩니다. – wst

+0

Gotcha - 시도해 보니 XQuery 구문 'attribute()'이 지원되지 않는다는 오류가 발생하여 잘못된 결과가 발생했을 것입니다. 그러나, 나는 특히 XML에서 속성을 사용하지 않기 때문에 괜찮습니다. "SET @ XML.modify ('delete/Whatever/* // * [empty (.// text())]')"완벽하게 작동하는 비트를 제거했습니다. 도와 주셔서 감사합니다! –