2012-04-01 4 views
6

내 라이브러리의 여러 객체에 대해 사용자 지정 데이터를 제공하기 위해 여러 XElement 객체를 사용하고 있습니다. 전체 XML 파일의 구조를 지정하는 것을 피하려고합니다. 라이브러리는 필요한 특정 요소가 올바르게 구조화되어있는 한 전체 XML이 어떤 모습인지 신경 쓰지 않아야하기 때문입니다.XElement의 XML 스키마 유효성 검사

이 목적을 달성하기 위해 필자는 내 클래스 요구 사항 각각에 대해 스키마를 정의하는 3 개의 개별 XSD 파일을 가지고 있지만 스키마에 대해 XElement의 유효성을 검사하는 데 문제가 있습니다. 해결 방법 없이는 그렇게 할 방법이없는 것 같습니다.

MSDN 페이지에서 XElement.Validate() 확장 방법은 큰 파일의 하위 요소의 유효성을 다시 검사하는 것으로 나타납니다. XElements 중 하나에 존재한다고 가정 할 수 없으므로 XmlSchemaObject 인수가 내 문제의 원인입니다. 나는 내 XmlSchemaSet에서 XmlSchemaObject 인수로 전달하기 위해 XmlSchemaElement을 붙잡음으로써이 문제를 해결할 수 있다고 생각하지만, XmlSchemaSet은 이미 모든 것을 정의하고 있기 때문에, 그렇게해야한다는 것이 이상하게 보입니다.

전체 XDocument의 유효성을 처음으로 확인하지 않고 XElement의 유효성을 검사 할 수있는 더 나은 옵션이 있습니까?

또는 비즈니스 계층에서 응용 프로그램의 스키마 유효성 검사를 처리하고 라이브러리가 XElement이 제대로 형성되었다고 가정해야합니다 (이 옵션을 고려했지만 개인적인 선호는 예외를 던지지 않으려 고하고 호출 메서드는 XElement이 반환 매개 변수를 통해 유효하지 않음을 알고 있습니다.

답변

9

제공되는 API에 대한 문제를 이해합니다. 두 가지 옵션이 있습니다. 하나는 XElementXDocument에 넣는 것입니다. XDocument doc = new XDocument(xElementToValidate);을 입력 한 다음 the Validate method on that XDocument을 호출해야합니다. 입니다. 두 번째 옵션은 윤곽을 그리는 방법으로 ValidateXElement 메서드를 사용하고 XmlSchemaSet과 루트 요소 정의를 전달합니다. 해당 스키마는 XmlSchemaObject으로 설정됩니다. 이들이 최상위 요소 정의가 하나 뿐인 단순한 스키마 인 경우, 예를 들어, 이 방법으로 두 가지 방법 중 하나를 포장하는 경우

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

은 다음는 .NET 프레임 워크가 제공 한 수있는 유사한 편리한 메소드를 호출보다 더 많은 노력해서는 안됩니다.

+0

나는 왜 내 자신의'XElement.Validate()'확장 메소드에서 코드를 래핑하는 것을 생각하지 못했는지 모른다. 당신이 그렇게 말할 때 논리적 인 것처럼 보입니다. 'XDocument'를 만드는 것은 또 다른 좋은 아이디어입니다. 너무 나 (나는 그것을 변환하는 방법을 찾으려고 너무 많은 시간을 보냈고, 나는 명백한 해결책을 놓쳤습니다.)이 발생 했어야합니다. 나는 둘 다 실험하고 내가 선호하는 것을 보게 될 것이다. – psubsee2003

관련 문제