2013-04-29 2 views
1

보낸 XML을 사용하여 클라이언트 XML의 유효성을 검사하려고합니다. 개략적으로는 다음과 같습니다XML 유효성 검사 : 요소를 네임 스페이스에 바인딩해야합니까?

<?xml version="1.0" encoding="UTF-8"> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.client.com" 
      targetNamespace="http://www.client.com" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      version="0.1"> 

<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="Parent" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="Parent"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Child1" type="xs:string"/> 
     <xs:element name="Child2" type="xs:string" nillable="true"/> 
     <xs:element name="Child3" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

내가 확인하고 싶은 XML의 예는

<Parent> 
    <Child1>Entry</Child1> 
    <Child2 xsi:nil="true"/> 
    <Child3>Entry</Child3> 
</Parent> 

내 질문이 있습니다 것 : 위의 XML이 실제로 잘 형성된다? XML에 대한 저의 (열악한) 이해는 'xsi'태그에 네임 스페이스가 필요하다고 생각하게 만듭니다. 그리고 이것이 실제로 유효성을 검사 할 때 우리가 얻는 오류입니다 (태그 'xsi'는 어떤 네임 스페이스에도 연결되어 있지 않습니다). 다음과 같이 XML을 변경하십시오.

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Child1>Entry</Child1> 
    <Child2 xsi:nil="true"/> 
    <Child3>Entry</Child3> 
</Parent> 

은 우리의 최종 문제를 수정하고 더 이해할 수 있습니다. 그러나 클라이언트는 원래 XML이 XMLSpy 및 VisualStudio에서 유효성을 검사하여 무언가를 놓쳤다 고 말했습니까?

도움을 주시면 감사하겠습니다. 매우 감사합니다!

+0

태그가 닫히지 않았습니다. – philipp

+0

좋은 장소! 불행히도 나쁘게 복사에 대한 내 잘못. 감사. – user2332163

+0

_real_ 질문을 반영하기 위해 제목을 편집했습니다. '_ 내 질문은 xsi 태그가 바인딩되어 있지 않음을 나타냅니다. 필요한 경우 XMLSpy에서 어째야 XMLSpy에서이를 확인한 것입니까? _' – Alberto

답변

0

올바른 형식의 XML과 유효한 XML 간에는 차이점이 있습니다. 귀하의 본보기는 올바른 형식이지만 올바르지 않습니다. 유효성은 스키마가 정의 된 경우 그림으로 나타납니다.

는 아래 두 기사

  1. http://dli.grainger.uiuc.edu/publications/xmltutorial/xml/tsld005.htm
  2. Referencing XSD Schemas in Documents
+0

감사합니다. Pangea에 대한 참조. 나는 나의 질문이 정당성과 정형성 중 하나 여야한다고 분명히 동의한다. 이 외에도 위의 두 번째 예가 구현 될 때 문제가 없습니다 (예 : 문서가 XSD를 명시 적으로 참조하지는 않지만 xsi 네임 스페이스는 바인딩 됨). 우리는 의도적으로 xml 태그를 잘못 배치하고 시스템이이를 잡는 지 확인함으로써 합법적 인 유효성 검사가 수행되고 있는지 확인했습니다. 그래서 내 질문은 정말 xsi 태그 바인딩의 부족을 가리키는 : 필요한, 그리고 만약 그렇다면, 왜 XMLSpy 분명히 어쨌든 그것을 확인하는 무엇입니까? – user2332163

0

이 네임 스페이스에 요소를 결합 할 필요가 읽기?

요소는 항상 'namespace name'에 바인딩됩니다. 네임 스페이스에 제공된 URI가 없으면 '네임 스페이스 이름'에 값이 없습니다. 그런 다음 noNamespaceSchemaLocation 속성을 사용하여 요소 유형을 정의 할 수 있습니다. 당신의 XML은 대상 네임 스페이스를 일치하는 경우

예를 들어,이 경우

<Parent xmlns="http://www.client.com" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.client.com client.xsd"> 
... 
</Parent> 

<!-- 
Remarks: 
(Line 1) default namespace (when using no prefix) = "http://www.client.com" 
(Line 3) provided that `client.xsd` is the correct client schema location. 
--> 

을 작성, 모두 ParentChild 요소는 "http://www.client.com"네임 스페이스에 속하고 검증은에 무슨에 대해 알고 XML의 유효성을 검사하십시오. 스키마가 targetNamespace="http://www.client.com"를 선언하지 않은 경우

, 다음 스키마에 대해 유효성을 검사하는 당신은 쓸 필요 것 :이 경우

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="http://www.client.com client.xsd"> 
... 
</Parent> 

을 모두 ParentChild은 "값이 없음"네임 스페이스에 속하는 따라서 "no-targetNamespaced"스키마에 대해 유효성 검사가 수행됩니다.

접두사를 네임 스페이스에 바인딩해야합니까?

예를 들어, 이것이 당신이 요구하는 것 같아요. specs에서 :

접두사는 정규화 된 이름의 네임 스페이스 접두사 부분을 제공하고, MUST는 네임 스페이스 선언의 네임 스페이스 URI 참조와 연관 될 수있다.

그래, 당신은 그들을 바인딩해야합니다.

+0

다른 문서 정의 유형에 속하는'noNamespaceSchemaLocation : Parent' 요소와'xsi : nil' 속성을 정의 할 때''의 의미를 이해하고있는 것 같습니까? – Alberto

+0

'_ 왜 XMLSpy는 분명히 그것을 검증하고 있습니까? _'XMLSpy는 자체적으로 더 우수한 규칙을 가지고 있으며 네임 스페이스 이름이 정의되지 않은'xsi : nil'을 무시합니다. 기본 "xmlns : xsi ="http://www.w3.org/2001/XMLSchema-instance "바인딩을 사용합니다. – Alberto

관련 문제