0

B2MML 標準 (具体的にはマテリアル スキーマ) の XSD スキーマの 1 つを使用して XML ファイルを検証する際に問題が発生します。コードは他の XSD で動作しますが、B2MML では動作しません。検証を処理する方法は次のとおりです。

public class XMLvalidate {

     public static void Xml2String(String xmlFile){
        // Danner JAVA DOM XML Parser

        DocumentBuilderFactory builderFactory =
               DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = null;
       try {
           builder = builderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();  
        }

       // Changes the XML file to XML DOM standard

       try {
           Document document = builder.parse(
                   new FileInputStream(new File(xmlFile)));
           Transformer transformer = TransformerFactory.newInstance().newTransformer();
           transformer.setOutputProperty(OutputKeys.INDENT, "yes");

           // Make the DOM XML file readable
           StreamResult result = new StreamResult(new StringWriter());
          DOMSource source = new DOMSource(document);
          transformer.transform(source, result);
           String xmlString = result.getWriter().toString();
           System.out.println(xmlString);
       } catch (SAXException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } catch (TransformerConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TransformerFactoryConfigurationError e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (TransformerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

   }

 public static void XMLValidator(String xmlFile, String validationFile)throws SAXException, IOException{


        String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
         SchemaFactory factory = SchemaFactory.newInstance(language);
        ((factory.newSchema(new File(validationFile))).newValidator()).validate(new StreamSource(new File(xmlFile)));


    }

 public static void main(String [] args){
     boolean flag = true;
     try{

            try{XMLValidator("src\\Material.xml", "src\\B2MML-V0600-Material.xsd");}
            catch (SAXException e){ flag = false; } 
            catch (IOException e) { flag = false; }
            System.out.println("XML fil is valid : " + flag);
 }
     catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
}

B2MML へのリンク: https://github.com/Rubatharisan/radis/blob/master/B2MML-V0600-Material.xsd XML ファイルへのリンク: https://github.com/Rubatharisan/radis/blob/master/ Material.xml

私たちの XML ファイルは、XSD ファイルから自動生成されます。XMLスパイ。

B2MML で動作しないのはなぜですか? 前もって感謝します。

エラー:

プログラムをもう一度調べたところ、以前のコメントで間違いを犯しました。このエラーが表示されました:

org.xml.sax.SAXParseException; systemId: file:/C:/Users/Bj%C3%B8rn/Desktop/Workspace2/XMLValidator/src/B2MML-V0600-Material.xsd; lineNumber: 183; columnNumber: 87; src-resolve: Cannot resolve the name 'Extended:MaterialInformation' to a(n) 'group' component.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDGroupTraverser.traverseLocal(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDAbstractParticleTraverser.traverseSeqChoice(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDAbstractParticleTraverser.traverseSequence(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.processComplexContent(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseComplexTypeDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseGlobal(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseGlobalDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseNamedElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseGlobal(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseSchemas(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
at javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
at javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
at XMLvalidate.XMLValidator(XMLvalidate.java:73)
at XMLvalidate.main(XMLvalidate.java:82)
4

1 に答える 1

0

エラー メッセージは、バリデータがグループの検索に失敗したことを示していますExtended:MaterialInformation。これ以上の調査がない限り、これについて最も可能性の高い説明は、相対 URI を使用して指定されたその名前空間のスキーマ ドキュメントを見つけることができなかったということB2MML-V0600-AllExtensions.xsdです。

エラー メッセージの文言から、 のローカル コピーを使用しているように見えるB2MML-V0600-Material.xsdため、バリデータは、ローカル コピーのベース URI を使用して相対参照を解決し、 でスキーマ ドキュメントを探します (表示されます) file:/C:/Users/Bj%C3%B8rn/Desktop/Workspace2/XMLValidator/src/B2MML-V0600-AllExtensions.xsd。トップレベルのスキーマ ドキュメントのローカル コピーを作成したとき、相対参照によって参照されるすべてのスキーマ ドキュメントのローカル コピーも正しい場所に作成しましたか? 同様に、すべてのスキーマ ドキュメントに対して、それら自体が相対参照によってインポート、インクルード、または再定義しますか? など、再帰的に?もしそうなら、ローカル コピーの構成に問題があった可能性があります。そうでない場合は、何をする必要があるかがわかります。

于 2013-11-15T16:15:42.060 に答える