次の XML を検証しようとしています
<query>
<colors logic="AND">
<color main="BLUE" tone="DARK" operator="=" />
</colors>
</query>
次のXSDを使用して
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="color">
<xsd:attribute name="main" type="xsd:string" use="required"/>
<xsd:attribute name="tone" type="xsd:string" use="required"/>
<xsd:attribute name="operator" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="colors">
<xsd:sequence>
<xsd:element name="color" type="color" maxOccurs="unbounded"> </xsd:element>
</xsd:sequence>
<xsd:attribute name="logic" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="query">
<xsd:sequence>
<xsd:element name="colors" type="colors" maxOccurs="2"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="query" type="query"></xsd:element>
</xsd:schema>
だから...名前空間なしでXMLを検証したい。XML は別のアプリケーションによって生成されているため、変更できません。クライアントが正しい要求を送信していることをサーバー側で保証したいだけです。
XSD に対して XML を検証しようとすると、次の例外メッセージが表示されます。
cvc-elt.1: Cannot find the declaration of element 'query'
私はすでに検索して、このような解決策に行き着きましたが、成功しませんでした
解決策(私を正しい方向に向けてくれた@Trarothに感謝します)---
これを検証する方法は次のとおりです。
私はこの機能を持っています:
public static Document buildValidRequest(String content, Schema xsd) throws SAXParseException, SAXException, IOException, ParserConfigurationException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setSchema(xsd);
XMLSimpleErrorHandler errorHandler = new XMLSimpleErrorHandler();
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(errorHandler);
StringReader reader = new StringReader(content);
Document validXML = builder.parse(new InputSource(reader));
if (errorHandler.getException() != null) {
throw errorHandler.getException();
}
return validXML;
}
そして、エラーを処理するこのクラス:
public class XMLSimpleErrorHandler implements ErrorHandler {
private SAXParseException exception;
@Override
public void warning(SAXParseException e) {
this.exception = e;
}
@Override
public void error(SAXParseException e) {
this.exception = e;
}
@Override
public void fatalError(SAXParseException e) {
this.exception = e;
}
public SAXParseException getException() {
return exception;
}
}
そして、スキーマを取得するこのメソッド:
private static Schema getSchema(String xsdPath) throws SAXException, IOException {
InputStream resourceAsStream = null;
try {
ServiceManager.getInstance().getLoggerManager().debug(RESTInitServlet.LOGCONTEXT, TAG, "Retrieving schema: "+xsdPath);
resourceAsStream = getInstance().getClass().getResourceAsStream(xsdPath);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource = new StreamSource(resourceAsStream);
Schema schema = schemaFactory.newSchema(schemaSource);
return schema;
} finally {
if (resourceAsStream != null) {
resourceAsStream.close();
}
}
}
これを気にしないでください: すべての中で最も奇妙なこと: Windows 7 で実行されている Tomcat 6 で動作します。Linuxで実行されているjbossで動作しません...