2011-08-25 2 views
58

xml 스키마 문서에서 targetNamespace와 xmlns가 모두 이고 접두사가 인 경우targetNamespace 및 xmlns없이 접두사가 무엇입니까?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.com/" xmlns="http://example.com/"> 

정확한 차이점은 무엇입니까? 내 이해는 접두어가없는 xmlns가 있으면 접두사가없는 모든 요소가 해당 네임 스페이스를 가져오고 ... 혼란스럽게도 targetNamespace에 동일하게 적용됩니다.

+0

하지만, 대답은 할 수 없습니다 XMLNS 기본 네임 스페이스입니다 이 문서 (스키마 문서)에 대한 targetNamespace는이 스키마 문서의 유효성을 검사하는 네임 스페이스입니까? 그리고 이런 식으로 xmlns와 targetNamespace는 두 가지 다른 것들입니까? – Vering

+0

@ 테스트 결과 찾기는 첫 번째 문장과 일치합니다. 예. targetNamespace는 스키마가 확인하는 문서를 확실히 참조합니다. targetNamespace의 존재는 또한 'xmlns'또는 'xmlns : xxx'가 있어야합니다. 실제로 많은 'xmlns : xxx', 'xmlns : yyy'및 'xmlns'를 함께 사용할 수 있으며 유효성을 검사합니다. – ifelsemonkey

답변

67

targetNamespace은 XML 스키마 "유물"입니다. 그 목적 : 스키마 파일이 설명하는 특정 XML 네임 스페이스를 나타 내기 위함.

xmlns - XML ​​스키마가 XML 문서이기 때문에 XML 파일 자체에 기본 XML 네임 스페이스를 정의 할 수 있습니다 (xmlns 속성의 기능). 그 의미는 여러 가지 : 저작 및 구성입니다. 예를 들어 스키마에 정의 된 항목의 접두어를 나중에 사용할 필요는 없습니다 (예 : 속성 또는 요소의 유형으로 사용되는 전역 단순 유형).

내 경험에 비추어 볼 때 많은 XML 스키마 작성자는 이것을 "우수 사례"라고 생각합니다. 따라서 올바른 방향으로 가고 있습니다.

XSD의 경우 targetNamespace는 요소, 특성, 그룹 및 특성 그룹, 단순 및 복합 형식을 포함하는 스키마 구성 요소의 정규화 된 이름의 네임 스페이스 부분을 규정합니다. XSD (요소 및 속성)에 정의 된 일부 규정 된 이름은 XML 인스턴스 문서에서 "직접"사용됩니다. 유형과 같은 기타 항목은 인스턴스 XML 문서의 xsi:type 속성을 통해 참조 할 수 있습니다. 나머지 (그룹, 속성 그룹)는 (참조를 통해) 스키마 작성을 용이하게합니다.

는 또한 (일반적으로) 사람들이 두 개의 각도에서 XSD를 설계에 올 것을 의견 해요 :

  • 기존 XML에 맞게. 이 경우 XML이 네임 스페이스를 사용하면 각 네임 스페이스에 대해 targetNamespace 특성이 일치하는 XSD 스키마 요소가 생성됩니다.

  • 순수 모델링. 그런 다음 targetNamespace를 UML 패키지, 데이터베이스 스키마 또는 Java 패키지 또는 .NET 네임 스페이스와 비슷하게 생각하면이 모든 경우를 의미합니다. 근본적으로 이름 충돌을 피하는 메커니즘입니다. 그럼에도 불구하고, 또한 주제 영역에서 모델을 분할하는 메커니즘 등

13

의 xmlns

의 xmlns가 세트에게 기술 요소의 기본 이름 공간을 속성입니다. 따라서 기본 네임 스페이스는 설명 된 요소 내부의 모든 요소에 적용됩니다.이 요소는 자체적으로 다른 네임 스페이스를 명시 적으로 선언하지 않습니다.

기본 이름 공간은 WSDL 파일에 대한 표준 값으로 설정 :이 속성은 웹 서비스의 이름 공간을 포함

http://www.w3.org/ns/wsdl

의 targetNamespace. 이 네임 스페이스는 자유롭게 선택할 수 있지만 URI가 서비스의 WSDL을 가리켜 야한다는 규칙이 있습니다.

의 xmlns : TNS

이 이름 공간이에 targetNamespace 속성과 같은 URI로 설정해야합니다. 그렇게하면 이름 공간 접두사 (tns)를 통해 대상 이름 공간을 참조 할 수 있습니다.

출처 : 여전히 혼란스러워하는 사람들을 위해 http://tutorials.jenkov.com/wsdl/description.html

14

,이 세 가지 XSD를 고려합니다. 그것들은 모두이를 참조하는 하나의 전역 유형과 하나의 전역 요소 정의를 정의합니다.

먼저 xsd가 위에 게시 된 것과 같습니다. 이 스키마 네임 스페이스 접두사 'XSD'과의 targetNamespace에 대한 기본 네임 스페이스 사용 : 이제

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns="http://example.com/"> 

    <xsd:element name="aGlobalElement" type="aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

같은 XSD를하지만 정의하고 대상 네임 스페이스에 대한 네임 스페이스 접두사를 사용하여 :

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns:tns="http://example.com/"> 

    <xsd:element name="aGlobalElement" type="tns:aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

... 그리고 마지막으로, 대신 XML 스키마 네임 스페이스에 대한 'XSD'의 기본 네임 스페이스를 사용하는 버전 :

<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns:tns="http://example.com/"> 

    <element name="aGlobalElement" type="tns:aGlobalType"/> 

    <simpleType name="aGlobalType"> 
    <restriction base="string"/> 
    </simpleType> 
</schema> 

스키마 저자 대부분의 경우 때문에, 첫 번째 또는 마지막 선택 기본 네임 스페이스 기능을 사용할 수있는 경우 무언가에에 사용할 수 있습니다.

-1

몇 가지 철저한 테스트 후 xmllint 여기에서 확실한 설명을 발견했다고 생각합니다. 위의 스키마는 아래 문서의 유효성을 확인

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns:p="http://abced.com" 
xmlns:q="http://pqr.com" 
xmlns="http://yyyzzz.com"> 

<xsd:element name="recipe" type="recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
</xsd:schema> 

: 아래의 스키마를 고려

<?xml version="1.0"?> 

<recipe xmlns="http://yyyzzz.com"> 
    Deciphering the purpose of targetNamespace 
</recipe> 

의 xmlns가 = "http://yyyzzz.com는"가 자동으로 결합하기 때문에 작동하는 이유는 엘리먼트는 스키마에 의해서도 정의된다. 즉, recipeType 요소에도 바인딩됩니다. 이제

도 확인하고 차이를 자세히 살펴 가지고 다음과 같이 동일한 XML 문서에 있지만 약간 수정 된 스키마 : 다른 의 xmlns 실종 경우

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns="http://eigenfield.aparicio.com" 
xmlns:EGboy="http://yyyzzz.com"> 

<xsd:element name="recipe" type="EGboy:recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

</xsd:schema> 

무시를 대신 자세히 보면 type = "EGboy : recipeType". xmlns에 다른 값이 있으므로 더 이상 의존 할 수 없기 때문에 접두어 EGboyrecipeType 앞에 붙여야합니다.

XML 문서도이 접두사는 스키마가 많다 경우 적절한 의 xmlns를 참조만을위한 것입니다 EGboy 접두사 상관하지 않습니다.

2

targetNamespaceschema의 속성으로, 요소는 XSD 파일의 네임 스페이스 즉 패키지를 정의합니다. 규칙에 따라 URI/URL을 사용하지만 임의의 문자열을 사용할 수 있습니다.

xmlns 속성은 현재 요소 범위의 xmlns 속성 값에서 오는 요소 및 데이터 유형을 나타 내기 위해 사용됩니다. 예를 들어

: P = "HTTP : //www.example xsd는 네임 스페이스 접두사없이 xsd:

  • xmlns="http://www.w3.org/2001/XMLSchema"로 시작해야 의미로

    • xmlns:xsd="http://www.w3.org/2001/XMLSchema"는 기본적
    • 의 xmlns이다 접두사이다. com/People "은 접두사가 p이고 접두사가 붙어야 함을 의미합니다. p:

    여기서 xmlns:xsdxmlns:p은 QNames이고 xmlns은 로컬 이름입니다.

    다음 이미지는 내 지식에 따라 자바 비유를 사용하여 XSD를 이해하는 데 도움이 :이 주제에 대한 지식이 부족 할 수

    enter image description here

  • 관련 문제