2009-07-01 1 views
8

편집은 내가이 개 프로젝트를 비주얼 스튜디오 솔루션을 /EDIT참조 된 스키마 파일이 다른 프로젝트/어셈블리에있을 때 VS에서 XSD schemaLocation 속성을 지정하는 방법은 무엇입니까?

아래에있는 내 솔루션을 참조하십시오.

  • 프로젝트 1 (ReferencedProject라고 함)에는 XML 스키마 파일 (ReferencedSchema.xsd)이 들어 있습니다.
  • 프로젝트 2 (MainProject라고 부름)에는 참조로 ReferencedProject가 포함되어 있습니다. MainProject에는 스키마 파일 (MainSchema.xsd)도 있습니다.

MainSchema.xsd에는 다음 코드가 포함

<?xml version="1.0"?> 
<xs:schema 
    xmlns="main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="main" 
    targetNamespace="main" 
    elementFormDefault="qualified"> 
    <xs:include schemaLocation="ReferencedSchema.xsd" /> 
    ... 
</xs:schema> 

ReferencedSchema.xsd가 (그것도 같은 프로젝트에없는) 같은 폴더에 아니기 때문에, 나는 "ReferencedSchema.xsd 말하는 오류가 해결할 수 없습니다. " 말이된다.

나는 XS를 편집하는 경우

이에 요소를 포함 ...

<xs:include schemaLocation="../../ReferencedProject/Data/ReferencedSchema.xsd" /> 

는 ... 오류가 사라집니다. 그러나 내 솔루션의 폴더 계층 내에서 내에서만 작동하는 스키마에 대한 상대 경로를 제공했음을 유의하십시오. 그것은 프로젝트에서 컴파일 할 때 편집기에서 스키마를 볼 때 좋지만 그렇게 좋지는 않습니다. 컴파일 후 "bin"폴더를 보면 폴더 계층이 완전히 다릅니다 (두 xsd 파일이 실제로 같은 폴더에서 끝납니다).

Visual Studio의 "기존 항목을 링크로 추가"기능을 사용하여 ReferecedSchema.xsd 파일의 주 스키마 파일과 같은 폴더에 바로 가기를 만들었지 만 작동하지 않았습니다. XSD 검사기는 실제로 링크가 실제 파일 인 것처럼 보이지 않습니다.

내 문제는 두 상황 (솔루션 탐색기 및 런타임 중에)에서 유효한 schemaLocation을 제공 할 수있는 URI가없는 것 같습니다. 누구든지 어떤 제안이 있습니까?

감사합니다.

편집

나는이 함께 가기로 결정 : 내 코드를 실행할 때 내가 잘못, 비주얼 스튜디오에서 일을 볼 수있어로

<xs:include schemaLocation="../../ReferencedProject/Data/ReferencedSchema.xsd" /> 

이만큼 정확합니다.

다음과 같이 내가 동적으로 올바른 상대 참조로의 schemaLocation 교체, 그것뿐만 아니라 런타임에 작동하도록하려면

public class UriReplacingXmlValidator 
{ 
    public virtual XDocument Validate(
     string dataFolderName, 
     string baseDataFolderName, 
     string xmlFileName, 
     string schemaFileName, 
     string baseSchemaFileName) 
    { 
     string rootFolderPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar; 
     string dataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + dataFolderName; 
     string baseDataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + baseDataFolderName; 
     string xmlPath = dataFolderPath + Path.DirectorySeparatorChar + xmlFileName; 
     string schemaPath = dataFolderName + Path.DirectorySeparatorChar + schemaFileName; 
     string baseSchemaPath = baseDataFolderName + Path.DirectorySeparatorChar + baseSchemaFileName; 
     XDocument xmlDocument = XDocument.Load(xmlPath); 
     XDocument schemaDocument = XDocument.Load(schemaPath); 
     ResetBaseSchemaLocation(schemaDocument, baseSchemaPath); 
     XmlValidator validator = new XmlValidator(); 
     bool isValid = validator.Validate(xmlDocument, schemaDocument); 
     if (isValid) 
      return xmlDocument; 
     else 
      return null; 
    } 

    protected virtual void ResetBaseSchemaLocation(XDocument schemaDocument, string baseSchemaPath) 
    { 
     XNamespace ns = "http://www.w3.org/2001/XMLSchema"; 
     XAttribute attribute = schemaDocument.Element(ns + "schema").Element(ns + "redefine").Attribute("schemaLocation"); 
     attribute.Value = baseSchemaPath; 
    } 

내가이 솔루션을 갔다 내 XML을 볼 수있어 여부를 모든 이제 작동하기 때문에 및 Visual Studio에서 XSD 파일을 실행하거나 내 응용 프로그램을 실행/디버깅 할 수 있습니다.

+0

잘못된 위치를 가리키는 위치에서 프로젝트를 컴파일하면 어떻게됩니까? 이 스키마에서 코드를 생성하고 있습니까? –

+0

안녕하세요, 위의 편집을 참조하십시오. 감사. – devuxer

답변

8

XSD는 경로 위치가 아닌 URI 위치 만 지원합니다.즉, file:///C:/path/to/VS/Projects/ReferencedProject/Data/ReferencedSchema.xsd은 유효하지만 ../../ReferencedProject/Data/ReferencedSchema.xsd은 유효하지 않습니다.

+0

@afroxav, 저에게 해명 해 주셔서 감사합니다. 나는이 문제를 해결하는 해결책을 생각해 냈다. – devuxer

+4

'../../path/to/file.xsd'에는 본질적으로 잘못된 것이 없습니다. 그것은 상대 URI이고 XSD 스펙에서 허용되며 .NET에서 올바르게 이해할 수 있습니다. 물론 위치가 반드시 있어야하며 적절한 액세스 권한이 있어야합니다. URI는 포함 된 문서의 문서 URI 또는 ​​가장 가까운'xml : base' 속성에있는 것 인 기본 URI에 대해 해석됩니다. – Abel

0

공개 URL 또는 공용 네트워크 공유를 사용하면 두 위치 모두에 해당 파일을 배치 할 수 있습니다.

1

면책 조항 : XML 스키마에 대해 많이 알지 못합니다. 어쨌든, 나는 너와 같은 문제에 부딪쳤다.

xs : include 대신 xs : import를 사용하면 VS 디자이너에서 내 문제가 해결되는 것으로 보입니다.

먼저 스키마 :

<xs:schema id="schema1" 
    targetNamespace="http://tempuri.org/schema1.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/schema1.xsd" 
    xmlns:mstns="http://tempuri.org/schema1.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
<xs:element name="MyType" nillable="true"/> 
<xs:complexType name="MyType"> 
    <xs:all> 
    <xs:element name="Value1" type="xs:double"/> 
    <xs:element name="Value2" type="xs:double"/> 
    </xs:all> 
</xs:complexType> 

</xs:schema> 

두 번째 스키마 -> 스키마를

<xs:schema id="schema2" 
    targetNamespace="http://tempuri.org/schema2.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/schema2.xsd" 
    xmlns:mstns="http://tempuri.org/schema2.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:schema1="http://tempuri.org/schema1.xsd" 
> 
    <xs:import namespace="http://tempuri.org/schema1.xsd"/> 

    <xs:element name="MySecondType" nillable="true"/> 
    <xs:complexType name=MySecondType> 
    <xs:element name="Value" type="schema1:MyType/> 
    </xs:complexType> 
</xs:schema> 

Visual Studio에서 XML 스키마를 편집하면 활성 사용하여 메뉴 항목 XML있는 스키마의 볼 수 있습니다.

+1

이것은 특정 문제를 해결할 수 있지만 스키마를 가져 오거나 포함하는 의미는 다릅니다. 가져 오기를 사용하면 가져 오기 우선 순위가 적용되고 include를 사용하면 선언이 복사 및 붙여 넣기 된 것처럼 작동합니다. – Abel

관련 문제