직장에서 우리는 데이터를 다른 오프라인 응용 프로그램으로 전달하기 위해 XML 파일을 생성 한 다음 일부 데이터를 업데이트하기 위해 다시 전달할 두 번째 XML 파일을 생성해야합니다. 이 과정에서 우리는 XML 파일의 구조에 대해 다른 응용 프로그램 팀과 논의했습니다.
내가 생각해 낸 샘플은 본질적으로 다음과 같습니다.
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
다른 팀은 이것이 업계 표준이 아니며 속성은 메타 데이터에만 사용해야한다고 말했다. 그들은 제안했다 :
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
내가 처음 제안한 이유는 생성 된 파일의 크기가 훨씬 작기 때문입니다. 전송하는 동안 파일에 약 80000 개의 항목이있을 것입니다. 실제로 그들의 제안은 내가 제안한 것보다 3 배 더 큽니다. 나는 언급 된 신비한 “Industry Standard”를 검색했지만 XML 속성은 메타 데이터에만 사용해야한다는 것이지만 메타 데이터가 무엇인지에 대한 논쟁이었다.
메타 데이터가 무엇인지 어떻게 판단하고 XML 문서의 구조를 디자인 할 때 속성이나 요소를 언제 사용할지 어떻게 결정해야합니까?
답변
나는이 경험 법칙을 사용한다 :
- 속성은 자체적으로 포함 된 것입니다 (예 : 색상, ID, 이름).
- 요소는 자체 속성을 갖거나 가질 수 있거나 다른 요소를 포함 할 수있는 것입니다.
그래서 당신은 가깝습니다. 나는 다음과 같은 일을했을 것입니다 :
편집 : 아래 피드백을 기반으로 원래 예제를 업데이트했습니다.
<ITEM serialNumber="something">
<BARCODE encoding="Code39">something</BARCODE>
<LOCATION>XYX</LOCATION>
<TYPE modelNumber="something">
<VENDOR>YYZ</VENDOR>
</TYPE>
</ITEM>
답변
속성과 관련된 몇 가지 문제는 다음과 같습니다.
- 속성은 여러 값을 포함 할 수 없습니다 (자식 요소는 가능)
- 속성은 쉽게 확장 할 수 없습니다 (향후 변경을 위해)
- 속성은 구조를 설명 할 수 없습니다 (자식 요소는 가능)
- 프로그램 코드로 속성을 조작하기가 더 어렵다
- 속성 값은 DTD에 대해 테스트하기 쉽지 않습니다
데이터의 컨테이너로 속성을 사용하면 읽고 관리하기 어려운 문서가 생깁니다. 요소를 사용하여 데이터를 설명하십시오. 데이터와 관련이없는 정보를 제공하기 위해서만 속성을 사용하십시오.
다음과 같이 끝내지 마십시오 (XML이 사용되는 방식이 아님).
<note day="12" month="11" year="2002"
to="Tove" to2="John" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
답변
“XML”은 “eXtensible Markup Language”의 약자입니다 . 마크 업 언어는 데이터가 텍스트이며 마크 업 되었음을 나타냅니다. 구조 및 포맷에 대한 메타 데이터와 함께.
XHTML은 의도 된 방식으로 사용 된 XML의 예입니다.
<p><span lang="es">El Jefe</span> insists that you
<em class="urgent">MUST</em> complete your project by Friday.</p>
여기서 요소와 속성의 구분이 명확합니다. 텍스트 요소는 브라우저에 표시되며, 속성에 대한 지침이다 방법 에 입니다 (그렇지 않은 태그가 몇 개 있지만).
XML이 마크 업 언어가 아니라 “데이터”와 “메타 데이터”의 구별이 더 모호한 데이터 직렬화 언어 로 사용될 때 혼동이 발생합니다 . 따라서 요소와 속성 사이의 선택은 속성 으로 표현할 수없는 것을 제외하고는 거의 임의적입니다 (feenster의 답변 참조).
답변
XML 요소와 XML 특성
XML은 모두 계약에 관한 것입니다. 먼저 기존의 XML 스키마 또는 커뮤니티 또는 산업 내의 기존 규칙을 따르십시오.
스키마를 처음부터 정의하려는 상황에 처한 경우 요소 대 속성 결정을 알려주는 몇 가지 일반적인 고려 사항이 있습니다 .
<versus>
<element attribute="Meta content">
Content
</element>
<element attribute="Flat">
<parent>
<child>Hierarchical</child>
</parent>
</element>
<element attribute="Unordered">
<ol>
<li>Has</li>
<li>order</li>
</ol>
</element>
<element attribute="Must copy to reuse">
Can reference to re-use
</element>
<element attribute="For software">
For humans
</element>
<element attribute="Extreme use leads to micro-parsing">
Extreme use leads to document bloat
</element>
<element attribute="Unique names">
Unique or non-unique names
</element>
<element attribute="SAX parse: read first">
SAX parse: read later
</element>
<element attribute="DTD: default value">
DTD: no default value
</element>
</versus>
답변
사용법에 따라 다를 수 있습니다. 데이터베이스에서 생성 된 구조화 된 데이터를 나타내는 데 사용되는 XML은 궁극적으로 필드 값이 속성으로 배치되는 데 효과적입니다.
그러나 메시지 전송으로 사용되는 XML은 종종 더 많은 요소를 사용하는 것이 좋습니다.
예를 들어 대답에서 제안 된 대로이 XML을 가지고 있다고 가정 해 보겠습니다.
<INVENTORY>
<ITEM serialNumber="something" barcode="something">
<Location>XYX</LOCATION>
<TYPE modelNumber="something">
<VENDOR>YYZ</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
이제 바코드를 인쇄하기 위해 ITEM 요소를 장치로 보내려고하지만 인코딩 유형을 선택할 수 있습니다. 필요한 인코딩 유형을 어떻게 표현합니까? 갑자기 우리는 바코드가 단일 자동 값이 아니라 인쇄 할 때 필요한 인코딩으로 규정 될 수 있음을 다소 뒤늦게 알고 있습니다.
<ITEM serialNumber="something">
<barcode encoding="Code39">something</barcode>
<Location>XYX</LOCATION>
<TYPE modelNumber="something">
<VENDOR>YYZ</VENDOR>
</TYPE>
</ITEM>
요점은 석재 구조를 고정하기 위해 네임 스페이스와 함께 XSD 또는 DTD를 구축하지 않는 한 옵션을 열어 두는 것이 가장 좋습니다.
IMO XML은 기존 코드를 사용하지 않고 유연하게 조정할 수있을 때 가장 유용합니다.
답변
속성 대 요소와 관련하여 스키마 디자인에서 다음 지침을 사용합니다.
- 오래 실행되는 텍스트 (보통 문자열 또는 normalString 유형의 요소)를 사용하십시오.
- 요소에 대해 두 개의 값 그룹 (예 : eventStartDate 및 eventEndDate)이있는 경우 속성을 사용하지 마십시오. 이전 예에는 startDate 및 endDate 속성을 포함 할 수있는 “event”에 대한 새 요소가 있어야합니다.
- 영업 날짜, 날짜 시간 및 숫자 (예 : 개수, 금액 및 비율)는 요소 여야합니다.
- 마지막 업데이트, 만료 등의 비업무 시간 요소는 속성이어야합니다.
- 해시 코드 및 인덱스와 같은 비업무 번호는 속성이어야합니다. * 유형이 복잡한 경우 요소를 사용하십시오.
- 값이 단순 유형이고 반복되지 않는 경우 속성을 사용하십시오.
- xml : id 및 xml : lang은 XML 스키마를 참조하는 속성이어야합니다.
- 기술적으로 가능한 경우 속성을 선호하십시오.
속성의 기본 설정은 다음을 제공합니다.
- 고유 (속성이 여러 번 나타날 수 없음)
- 순서는 중요하지 않습니다
- 위의 속성은 상속 가능합니다 (이것은 “모든”콘텐츠 모델이 현재 스키마 언어에서 지원하지 않는 것입니다)
- 보너스는 덜 장황하고 더 적은 대역폭을 사용한다는 것입니다. 그러나 실제로 요소보다 속성을 선호하는 이유는 아닙니다.
속성을 사용할 수없는 시간이 있기 때문에 기술적으로 가능한 경우 추가했습니다 . 예를 들어, 속성 세트 선택. 예를 들어, 현재 스키마 언어에서는 (startDate 및 endDate) xor (startTS 및 endTS)를 사용할 수 없습니다.
XML 스키마가 “모든”컨텐츠 모델의 제한 또는 확장을 허용하기 시작하면이를 삭제합니다.
답변
의심 스러울 때 KISS- 속성을 사용해야 할 명확한 이유가 없을 때 속성과 요소를 혼합하는 이유. 나중에 XSD를 정의하기로 결정하면 결국 더 깨끗해질 것입니다. 그런 다음 나중에 XSD에서 클래스 구조를 생성하기로 결정하면 더 간단해질 것입니다.