null XML 요소를 나타내는 올바른 방법은 무엇입니까?


166

null여러 가지 방법으로 표현 된 요소를 보았습니다 .

요소는 다음과 같이 존재합니다 xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

요소가 존재하지만 빈 요소로 표시됩니다 ( '빈'으로 잘못되어 null의미 상 다른 것으로 생각합니다).

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

요소가 반환 된 마크 업에 전혀 존재하지 않습니다 .

 <book>
     <title>Beowulf</title>
 </book>

요소에는 <null/>하위 요소가 있습니다 ( 아래 TStamper 에서 ).

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

그러한 null가치 를 표현하는 올바른 방법 또는 정식적인 방법이 있습니까? 위의 예보다 추가 방법이 있습니까?

위 예제의 XML은 고안되었으므로 너무 많이 읽지 마십시오. :)

답변:


121

xsi : nil은 다음과 같은 값을 나타내는 올바른 방법입니다. DOM 레벨 2 호출 getElementValue ()가 발행 될 때 NULL 값이 리턴됩니다. xsi : nil은 또한 내용 유형이 일반적으로 빈 요소를 허용하지 않더라도 내용이없는 유효한 요소를 나타내는 데 사용됩니다.

빈 태그를 사용하면 getElementValue ()는 빈 문자열 ( "")을 반환합니다. 태그를 생략하면 작성자 태그도 존재하지 않습니다. 이는 'nil'로 설정하는 것과 의미 상 다를 수 있습니다 (예 : "Series"를 nil로 설정하는 경우 책이 시리즈에 속하지 않을 수 있지만 시리즈를 생략하면 시리즈가 현재 요소에 적용 할 수없는 요소임을 의미 할 수 있습니다.)

보낸 사람 : W3C

XML Schema : Structures는 컨텐츠가 비어 있거나 컨텐츠를 허용하지 않아도되는 컨텐츠 유형에도 불구하고 엘리먼트가 컨텐츠가 없을 때 엘리먼트가 유효하다고 받아 들여 져야한다는 신호 전달 메커니즘을 소개합니다. 속성 값이 true 인 xsi : nil 속성을 가진 요소는 내용없이 유효 할 수 있습니다. 레이블이 지정된 요소는 비어 있어야하지만 해당 복합 유형에 의해 허용되는 경우 속성을 가질 수 있습니다.

설명 :
book xml 요소가 있고 자식 요소 중 하나가 book : series 인 경우 채울 때 몇 가지 옵션이 있습니다.

  1. 요소 전체 제거-시리즈에이 책이 적용되지 않거나 해당 책이 시리즈의 일부가 아님을 나타내려면 수행 할 수 있습니다. 이 경우 book : series와 일치하는 템플릿이있는 xsl 변환 (또는 다른 이벤트 기반 프로세서)은 호출되지 않습니다. 예를 들어, xsl이 책 요소를 테이블 행 (xhtml : tr)으로 바꾸면이 방법을 사용하여 잘못된 수의 테이블 셀 (xhtml : td)을 얻을 수 있습니다.
  2. 요소를 비워 두는 경우-시리즈가 ""이거나 알 수 없거나 책이 시리즈의 일부가 아님을 나타낼 수 있습니다. book : series와 일치하는 모든 xsl 변환 (또는 다른 기본 기반 파서)이 호출됩니다. current ()의 값은 ""입니다. 이 방법을 사용하면 다음에 설명하는 것과 같은 수의 xhtml : td 태그를 얻을 수 있습니다.
  3. xsi : nil = "true"사용-이것은 book : series 요소가 비어있는 것이 아니라 NULL임을 나타냅니다. book : series와 템플릿이 일치하는 xsl 변환 (또는 다른 이벤트 기반 파서)이 호출됩니다. current ()의 값은 비어 있습니다 (빈 문자열 아님). 이 방법과 (2)의 주요 차이점은 book : series 스키마 유형이 빈 문자열 ( "")을 유효한 값으로 허용 할 필요가 없다는 것입니다. 이것은 직렬 요소에는 의미가 없지만 스키마에서 열거 된 유형으로 정의 된 언어 요소에 대해서는 xsi : nil = "true"를 사용하여 요소에 데이터가 없을 수 있습니다. 다른 예는 10 진수 유형의 요소입니다. 비워 두려면 ""와 10 진수 만 허용하는 열거 된 문자열을 결합하거나 닐 가능한 소수를 사용할 수 있습니다.

11
전무는 정확하지만 당신은 적절한 네임 스페이스에 있는지 확인해야합니다 : XSI 사용에 xmlns : XSI = " w3.org/2001/XMLSchema-instance "
STW

실제로 xmlns:xsi="http://w3.org/2001/XMLSchema-instance"입니다. 누락 된 http : //에 유의하십시오. 네임 스페이스 문자열은 실제로 XML이 아닌 XML 파서의 문자열이기 때문에 중요합니다.
Burak Arslan

9
허, 나는 그것이 여전히 약간 잘못이라고 생각합니다. 이어야합니다 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". "www."를 참고하십시오.
Janne Mattila를

내 대답에 명시된 바와 같이, 나는 요소의 상태를 나타내는 것이 아니라 요소의 사용에 대한 제한 때문에 해석에 동의하지 않는다
Oakcool

2
@ChrisV : 사실이 아닙니다 xsi:. 접두사를 선언해야합니다. 네임 스페이스를 인식하는 XML 파서는 xsi:접두어를 선언하지 않고 사용하려고하면 XML 문서를 거부합니다 . 여기에 관련된 사양은 w3.org/TR/xml-names/#nsc-NSDeclared ( "네임 스페이스 제약 조건 : 접두사 선언")이며 사전 정의 된 접두사 만 xml:xmlns:입니다. XML 스키마는 XML 네임 스페이스 사양 위에 구축되지만 XML 네임 스페이스 사양을 위반하는 사전 정의 된 접두사를 추가하지 않습니다.
Simon Kissane

9

XML에는 기본적으로 null 개념이 없으므로 정식 답변이 없습니다. 그러나 객체 그래프에 null이 있기 때문에 Xml / Object 매핑을 원한다고 가정합니다. 따라서 당신의 대답은 "도구가 무엇을 사용하든"입니다. 핸들링을 쓰면 원하는 것을 의미합니다. XML 스키마를 사용하는 도구의 xsi:nil경우가는 길입니다. 대부분의 매퍼의 경우 일치하는 요소 / 속성을 생략하는 것이 좋습니다.


8

XML의 유효성을 검사하는 방법에 따라 다릅니다. XML 스키마 유효성 검사를 사용하는 경우 올바른 null값 표현 방법은 xsi:nil속성을 사용하는 것입니다.

[ 출처 ]


7

w3 링크의 문서

http://www.w3.org/TR/REC-xml/#sec-starttags

이것이 권장되는 양식이라고 말합니다.

<test></test>
<test/>

다른 답변에 언급 된 속성은 상태의 표현이 아닌 유효성 검사 메커니즘입니다. http://www.w3.org/TR/xmlschema-1/#xsi_nil을 참조 하십시오

XML Schema : Structures 는 컨텐츠가 비어 있거나 컨텐츠를 허용하지 않아도되는 컨텐츠 유형에도 불구하고 엘리먼트가 컨텐츠가 없을 때 엘리먼트가 유효하다고 받아 들여 져야한다는 신호 전달 메커니즘을 소개합니다 . 속성 값이 true 인 xsi : nil 속성을 가진 요소는 내용없이 유효 할 수 있습니다. 레이블이 지정된 요소는 비어 있어야 하지만 해당 복합 유형에 의해 허용되는 경우 속성을 가질 수 있습니다.

이 답변을 명확히하려면 : 내용

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
그것은 요소에 대한 권장 사항입니다 . 당신은 비어있는 === 널이라는 의견에 있습니까? 상황에 따라 다르지만 둘 사이에는 차이가 있다고 생각합니다. 당신이 그것들이 같다고 진술한다면, 나는 당신의 대답에 그 주장을 언급하는 것이 좋습니다.
Rob Hruska

1
Empty는 null과 같지 않습니다. 만약 그렇다면,이 stackoverflow 질문은 결코 요청되지 않았을 것입니다. 이 답변은 잘못되었습니다. 그러나 프로그래머는 xml을 읽을 논리가 누락 된 요소 또는 xsi : nil을 처리 할 준비가되었는지 확인해야합니다. 그렇지 않은 경우 다음 양식 중 하나를 사용해야 할 수도 있습니다. 즉, null / missing 요소와 빈 요소의 차이를 잃을 필요가 있습니다.
ToolmakerSteve

@RobHruska 예, 맞습니다. 빈 요소의 정의이지만 KitsuneYMG가 가리키는 W3C 정의를 고려하면 요소가 null이어야하며 해당 표현이 태그를 사용하여 현재 상태를 표시하므로 해당 답변에 동의하지 않으며 빈은 null 요소의 가장 좋은 표현이라고 생각합니다. 아이디어는 간단합니다. 좋은 구조를 유지하려면 모든 요소를 ​​나타내야합니다.
Oakcool

4

당신이 사용하는 xsi:nil스키마의 의미는 요소가 기본 값이 있는지, 그리고 요소가없는 경우 기본값이 사용되어야한다고 지시 할 때. 나는 앞의 문장이 자명 한 끔찍한 아이디어가 아닌 똑똑한 사람들이 있다고 가정해야하지만 그것은 나에게 9 종류의 나쁜 것 같습니다. 내가 사용해 본 모든 XML 형식은 요소를 생략하여 null 값을 나타냅니다. (또는 속성으로 속성을 표시하는 것이 좋습니다 xsi:nil.)


문서 게시 앱에서 요소에 내용이없는 경우 제목 페이지의 날짜를 현재 날짜로 기본 설정하려면 date요소를 완전히 생략 해도 큰 도움이되지 않습니다. 앱은 제목 페이지에서 원하는 위치를 알 수 없으므로 표시 할 날짜입니다. 생략 된 요소에 가능한 위치가 하나만있는 경우에는 이것이 문제가되지 않습니다. 실제 문서 어휘에서는 거의 모든 요소에 가능한 위치가 많이 있습니다.
CM Sperberg-McQueen

4

속성이나 요소를 생략하면 덜 공식적인 데이터에서 잘 작동합니다.

보다 정교한 정보가 필요한 경우 GML 스키마는 nilReason 속성을 추가합니다 (예 : GeoSciML :) .

  • xsi:nil 값이 "true"인 경우 사용 가능한 값이 없음을 나타냅니다.
  • nilReason결 측값에 대한 추가 정보를 기록하는 데 사용될 수 있습니다. 이는 표준 GML 이유 ( missing, inapplicable, withheld, unknown) 중 하나 이거나 앞에 추가 된 텍스트 other:이거나보다 자세한 설명에 대한 URI 링크 일 수 있습니다.

데이터를 교환 할 때 XML이 일반적으로 사용되는 역할, 한 명의 수신자에게 전송 된 데이터 또는 특정 목적으로 사용되는 데이터는 다른 인증을 받았거나 지불 한 다른 사람이 사용할 수있는 내용이 가려 질 수 있습니다. 내용이 누락 된 이유를 아는 것이 매우 중요 할 수 있습니다.

과학자들은 왜 정보가 없는지에 대해 우려하고 있습니다. 예를 들어 품질상의 이유로 삭제 된 경우 원래의 잘못된 데이터를보고 싶을 수 있습니다.


2

대부분의 경우 Null 값의 목적은 이전 버전의 응용 프로그램에 없었던 데이터 값을 제공하는 것입니다.

응용 프로그램 "ReportMaster"버전 1의 xml 파일이 있다고 가정합니다.

이제 ReportMaster 버전 2에는 정의되거나 정의되지 않을 수있는 몇 가지 속성이 추가되었습니다.

'no tag means null'표현을 사용하면 ReportMaster 1 xml 파일을 읽을 수 있도록 자동으로 이전 버전과 호환됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.