스키마 정보가 XML에서 가져온 XML 스키마를 XML 스키마와 비교하여 유효성을 검사해야합니다.Java에서 유효성 검사 중 XML에서 스키마 정보 가져 오기
나는 그것의 네임 스페이스를 정의하는 XML 문서를 가지고있다. 이와 같이 :
스키마 위치가 문서에 없으므로 지정된 유효 네임 스페이스에 대한 스키마는 유효성 검사기에게 알려야합니다. 지금은 그것을 다음과 같은 방법으로 수행
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder parser = dbf.newDocumentBuilder();
Document document = parser.parse(new File("mydocument.xml"));
String namespace = document.getChildNodes().item(0).getNamespaceURI();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new DOMSource(document));
작동이 방법을하지만 두 가지 문제가 있습니다 내가 수동으로 먼저 문서를 구문 분석하고 스키마를 만들 필요가 있다고 종류의 서투른
1) 이론적으로 유효성 검사기가 자동으로 처리하는 데 필요한 모든 정보를 가지고 있지만.
2) Document 객체의 유효성을 검사 할 경우 정확한 줄 번호가 표시되지 않습니다. 올바른 줄 번호를 얻으려면 동일한 문서를 두 번 구문 분석해야합니다 (네임 스페이스를 얻으려면 먼저, 유효성을 검사하려면 두 번째).
아무도 더 나은 해결책을 알고 있습니까?
구문 분석 전에 namespace1이 schema1.xsd, namespace2가 schema2.xsd 등과 일치한다는 것을 파서에 알리는 방법이 있습니까? 또는 구문 분석기가 스키마를 요청할 때 사용할 수있는 일종의 콜백을 작성할 수 있습니까 (예 : LSResourceResolver를 SchemaFactory에 제공 할 수 있습니까?).
1. schemaLocation 속성이 존재하지만 내 경우는 존재하지 않는 내가이 속성을 사용하도록 강제 할 수없는 경우가 작동시킬 수 있습니다. 네임 스페이스 만 주어진 경우 문서의 유효성을 검사 할 수 있어야합니다. 2.이 방법으로 작동하지만 내 문제가 있습니다. 필자는 XML 문서를 엿보기 전에 어떤 스키마를 사용할 지 모르겠습니다. 내가 찾고있는 것은 파서에게 namespace1이 schema1.xsd에, namespace2가 schema2.xsd에 파싱하기 전에 또는 파서가 스키마에 요청할 수있는 일종의 콜백을 쓰는 옵션을 파서에게 알려주는 방법입니다 . – martsraits