편집은 내가이 개 프로젝트를 비주얼 스튜디오 솔루션을 /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 파일을 실행하거나 내 응용 프로그램을 실행/디버깅 할 수 있습니다.
잘못된 위치를 가리키는 위치에서 프로젝트를 컴파일하면 어떻게됩니까? 이 스키마에서 코드를 생성하고 있습니까? –
안녕하세요, 위의 편집을 참조하십시오. 감사. – devuxer