2009-05-31 2 views
3

나는 다음 (errorous) XML을 가지고XSD 검증 문제

<jobs> 
    <job> 
     <id>1</id> 
     <state><![CDATA[IL]]></state> 
    </job> 
    <job> 
     <id>2</id> 
    </job> 
</jobs> 

아이디 모두와 항목을 reqired있는 상태 노드를. 나는 그것을 위해 XSD를 썼다 :

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="importvalidator" 
    elementFormDefault="qualified" 
    targetNamespace="http://foo.org/importvalidator.xsd" 
    xmlns="http://foo.org/importvalidator.xsd" 
    xmlns:mstns="http://foo.org/importvalidator.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="jobs"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="job" minOccurs="1" maxOccurs="unbounded"> 
       <xs:complexType> 
       <xs:all> 
        <xs:element name="id" type="xs:string" minOccurs="1"/> 
        <xs:element name="state" type="xs:string" minOccurs="1"/> 
       </xs:all> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

그리고 그것은 여전히 ​​구조적으로 유효한 XML로 확인합니다. 내가 여기서 무엇을 놓치고 있니?

갱신 1 : 내가 사용 코드는 C#으로이다 :

 XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add("http://foo.org/importvalidator.xsd", "validator.xsd"); 

     XDocument doc = XDocument.Load(fileName); 
     if (doc == null | doc.Root == null) 
     { 
      throw new ApplicationException("xml error: the referenced stream is not xml."); 
     } 

     doc.Validate(schemas, (o, e) => 
     { 
      throw new ApplicationException("xsd validation error: xml file has structural problems"); 
     }); 

답변

3

당신의 XML 포맷을하시기 바랍니다 두 번째는 "<job>"입니다. 특히 XSD의 대상 네임 스페이스는 "http://foo.org/importvalidator.xsd"이지만 XML에는 네임 스페이스가 없습니다.

XSD 및 XML에 대한 간단한 테스트 케이스를 설정하십시오.이 테스트 케이스는 실패 할 것입니다. 유효성 검사를하지 않는 이유를 추적하는 것이 좋습니다.

또한, 당신의 XSD는 요소 및 스키마 닫기 태그가 없습니다, 그래서 오류를 제공한다 - 또는 당신은 스키마에서의 targetNamespace를 제거 할 수 있습니다


:-) 단지 잘못 붙여 넣기입니다 :

<xs:schema id="importvalidator" 
    elementFormDefault="qualified" 
    targetNamespace="http://foo.org/importvalidator.xsd ← DELETE THIS" 
    xmlns="http://foo.org/importvalidator.xsd" 
    xmlns:mstns="http://foo.org/importvalidator.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

는 그래서는 다음과 같습니다

<xs:schema id="importvalidator" 
    elementFormDefault="qualified" 
    xmlns="http://foo.org/importvalidator.xsd" 
    xmlns:mstns="http://foo.org/importvalidator.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

PS : 아는 사람 어떻게 높은 수/IF SO의 가격 인하와 함께 소스 코드의 가벼운 부분?

+2

@ 13ren : 서식을 고정 했으므로 닫기 태그가 표시됩니다. 네임 스페이스 때문에 유효하지 않습니다. –

+0

@ 13ren : 헝가리어 자판 배열 + Google 크롬을 사용하면 코드 블록을 삽입 할 수 있으면 행복합니다 .../ – balint

+0

@ 13ren, @ John : 네임 스페이스 선언없이 유효성 검사를 수행하려면 어떻게해야합니까? ? – balint

0

어떤 파서/언어를 사용하고 있습니까? 이전에는 Xerces 파서에게 Java를 사용하고있는 경우 XSD 확인을 원한다는 사실을 알려야했습니다. 그러나 latest release 문서를 확인한 후 유효성 검사가 내장 된 것을 볼 수 있습니다. 그래서 버전이 중요해 보입니다. .NET 개발자라면 설정이 무엇인지 확인하는 것이 가장 좋습니다.

그냥 호기심 - 왜 당신의 예제에서 국가를 둘러싼 CDATA? 그럴 필요가 없습니다, AFAIK. XSD에 제한을 삽입하여 유효한 미국 주 코드 만 확보 할 수도 있습니다.

먼저 먼저 스키마 유효성 검사를 받으십시오.

<jobs> 
    <job> 
    <id>1</id> 
    <state><![CDATA[IL]]></state> 
    </job> 
    <job> 
    <id>2</id> 
    </job> 
</jobs> 

을 당신이 실제로 그것을 검증하지 않을 생각 - 네임 스페이스가 XML 유효성을 검사하지 않는 것을 의미, 심지어 "<state>"로이 같은 -이 쉽게 읽을 그래서

+0

@duffymo : 귀하의 의견을 보내 주셔서 감사합니다. 1) C#의 .net 프로젝트입니다. 2) 알아요,하지만 XML의 구조를 수정할 수 없습니다. 아직 상태 코드 유효성 검사가 프로젝트 범위에 없습니다 (아직). – balint

+0

대단히 반갑습니다. 내가 더 도움이되지 않아서 미안해. 불필요한 CDATA를 구조체를 수정하는 것으로 제거하는 것을 고려하지는 않지만 아마도 모든 요구 사항을 모를 것입니다. 중요성이 커지면 국가 유효성 검사를 생각하는 것이 좋지만, 오늘은 그날이 아닐지도 모릅니다. – duffymo

2

@ 13ren은 정답입니다. 노드가 스키마와 일치하지 않으면 오류가 아닙니다. 그것은 단지 경고 일뿐입니다. 나는 아래의 코드에 경고를 볼 수 있습니다

경고 :

private static void ValidateDocument(XmlSchemaSet schemas, string uri) 
{ 
    var settings = new XmlReaderSettings 
         { 
          Schemas = schemas, 
          ValidationFlags = 
           XmlSchemaValidationFlags. 
            ProcessIdentityConstraints | 
           XmlSchemaValidationFlags. 
            ReportValidationWarnings, 
          ValidationType = ValidationType.Schema 
         }; 
    settings.ValidationEventHandler += OnValidationEventHandler; 
    using (var validatingReader = XmlReader.Create(uri, settings)) 
    { 
     XDocument.Load(
      validatingReader, 
      LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); 
    } 
    return; 
} 

이 다음과 같은 생산 요소 '작업'에 대한 스키마 정보를 찾을 수 없습니다. 경고 : 'job'요소에 대한 스키마 정보를 찾을 수 없습니다. 경고 : 'id'요소에 대한 스키마 정보를 찾을 수 없습니다. 경고 : 'state'요소에 대한 스키마 정보를 찾을 수 없습니다. 경고 : 'job'요소에 대한 스키마 정보를 찾을 수 없습니다. 경고 : 'id'요소에 대한 스키마 정보를 찾을 수 없습니다.

당신의 XML을 변경하고 다시 실행 :

오류 :

<?xml version="1.0" encoding="utf-8" ?> 
<jobs xmlns="http://foo.org/importvalidator.xsd"> 
    <job> 
    <id>1</id> 
    <state><![CDATA[IL]]></state> 
    </job> 
    <job> 
    <id>2</id> 
    </job> 
</jobs> 

은 예상 오류 발생 'http://foo.org/importvalidator.xsd'네임 스페이스 요소 '작업은'불완전한 콘텐츠가 있습니다. 예상 가능한 요소 목록 : 네임 스페이스 'http://foo.org/importvalidator.xsd'에 'state'.

+0

존, 귀하의 답변 주셔서 감사합니다! XDocument를 사용하여 유효성 검사를위한 좋은 예를 찾고 있었는데, 이것이 전부다 : Xml 파일에서 네임 스페이스를 설정하지 않고 Xsd로 유효성을 검사 할 수 없습니까? (그것은 거대한 xml 크기이며, 구조를 수정하면 감사 할 만하다.로드 속도에 영향을 미친다.) – balint

+0

내 생각을 잊어 버린 것 같아. XML이 네임 스페이스없이 유효하다면 스키마가 잘못되었습니다. 스키마가 올바르다면 XML은 네임 스페이스없이 유효하지 않습니다. –