2

この検証手順については、ウェブ上に多くのマニュアルがあります。この事実にもかかわらず、コードが適切に機能しない理由を見つけることができません。ここで取得した入力スキーマと xml の値。

static String schemaString ="<?xml version=\"1.0\"?>" +
        "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" +
        " targetNamespace=\"http://www.java2s.com\"" +
        " xmlns=\"http://www.java2s.com\"" +
        " elementFormDefault=\"qualified\">" +
        "<xs:element name=\"note\">" +
        "<xs:complexType>" +
        "<xs:sequence>" +
        "<xs:element name=\"to\" type=\"xs:string\"/>" +
        "<xs:element name=\"from\" type=\"xs:string\"/>" +
        "<xs:element name=\"heading\" type=\"xs:string\"/>" +
        "<xs:element name=\"body\" type=\"xs:string\"/>" +
        "</xs:sequence>" +
        "</xs:complexType>" +
        "</xs:element>" +
        "</xs:schema>";

static String xmlString = "<?xml version=\"1.0\"?>" +
        "<note>" +
        "<to>rtoName</to>" +
        "<from>FromName</from>" +
        "<heading>Info</heading>" +
        "<body>Message Body</body>" +
        "</note>";

    String xml;
    XMLReader xmlReader = null;
    try {

        SAXSource source = new SAXSource(new InputSource(new StringReader(schemaString)));
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(source);

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setSchema(schema);
        SAXParser saxParser = spf.newSAXParser();
        xmlReader = saxParser.getXMLReader();
    } catch (Exception e) {
        e.printStackTrace();
    } 

    // parsing step after all preconditions succeeded
    try {
          xmlReader.parse(new InputSource(new StringReader(xmlString)));
    } catch (Exception e) {
        e.printStackTrace();   
    }

実行結果は次のようになります。

[Error] :1:28: cvc-elt.1: Cannot find the declaration of element 'note'.

デバッガーモードでは、すべて問題ないようです。スキーマが正しく設定されているなど。アイデア?

4

2 に答える 2

2

使用している特別な理由はありますXMLReaderか?
私は別の方法を提示したいと思います、あなたはそれが役に立つと思うかもしれません:

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;      

// ...

   try {
        // load schema from file
        File schemaFile = new File(schemaLocation);
        // load xml source form string holding the content
        Source xmlFile = new StreamSource(new StringReader(fileContent));

        SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        Schema schema = schemaFactory.newSchema(schemaFile);

        Validator validator = schema.newValidator();

        validator.validate(xmlFile);

        System.out.println("XML is valid");

    } catch (Exception e) {

        System.out.println("XML is NOT valid");
        System.out.println("Reason: " + e.getMessage());

    }
于 2012-08-16T15:52:16.383 に答える
2

問題は、XML で定義されていない名前空間にあると思います。

名前空間を明示的に設定してみてください ( targetNamespaceXSD の your を参照してください:

static String xmlString = "<?xml version=\"1.0\"?>" +
    "<note xmlns=\"http://www.java2s.com\">" +
    "<to>rtoName</to>" +
    "<from>FromName</from>" +
    "<heading>Info</heading>" +
    "<body>Message Body</body>" +
    "</note>";
于 2012-08-16T15:28:10.087 に答える