factory.setAttribute(
    "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
    "http://www.w3.org/2001/XMLSchema");
factory.setAttribute(
    "http://java.sun.com/xml/jaxp/properties/schemaSource",
    "file:" + xsdPath);

解决方案 »

  1.   

    parser.setProperty(SCHEMA_SOURCE, xsdfile);
                parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA);
                //parser.setProperty(SCHEMA_SOURCE,xsdfile);
    这段代码不不对factory.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
        "http://www.w3.org/2001/XMLSchema");
    factory.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaSource",
        "file:" + xsdPath);
      

  2.   

    看错了应该是
    parser.setProperty(SCHEMA_SOURCE, xsdfile);
                parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA);
                //parser.setProperty(SCHEMA_SOURCE,xsdfile);
    这段代码不不对parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
                parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:" + xsdPath);
    xsdPath 是schema文件的绝对路径
      

  3.   

    pretenderxzz(伪装者) 兄台,谢谢你的关注,我现在按照你的方法,把程序调整如下,但是我的xml文档在明显不满足xsd的情况下还是验证成功.
    public boolean validatexmlbyxsd(String xmlfilename,String xsdfilename,boolean validatesuccess){
            File xmlfile=new File(xmlfilename);
            File xsdfile=new File(xsdfilename);
            //检测原文件和验证文件是否存在
            if(!((xmlfile.exists())&&(xsdfile.exists())))
              {return false;}
            SAXParserFactory factory=SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            factory.setValidating(true);
            try{
                SAXParser parser=factory.newSAXParser();
                parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
                parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:" + xsdfilename);
                parser.parse(xmlfile, new DefaultHandler());
                validatesuccess = true;
            }catch(SAXNotRecognizedException ex){
            System.err.println("未知的属性异常:"+ex.getMessage());
            validatesuccess=false;
            }catch(SAXNotSupportedException ex){
            System.err.println("不支持的属性:"+ex.getMessage());
            validatesuccess=false;
            }catch(ParserConfigurationException ex){
            System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage());
            validatesuccess=false;
            }catch(SAXException ex){
            System.err.println("您的解析器不是jaxp 1.2所支持的"+ex.getMessage());
            validatesuccess=false;
            }catch(IOException ex){
            System.err.println(""+ex.getMessage());
            validatesuccess=false;
            }catch(Exception ex){
            System.err.println(ex.getMessage());
            validatesuccess=false;
            }
            return validatesuccess;
          }
    -----------------------------------------------------
    我在验证语句是:
    boolean a=validatexmlbyxsd所在类的对象.validatexmlbyxsd("E:/a.xml","E:/b.xsd",false);
                if(a)
                {
                    System.out.println("yes");
                }
                else
                {
                    System.out.println("failed");
                }
    每次的结果都是yes,即使我的xml不符合xsd的格式,结果都显示的yes啊!你能给我一个完整的例子嘛,谢谢,急得很,设计要交了.我的油箱[email protected].谢谢你了啊,帮帮忙,事成立马送分,不够再加!
      

  4.   

    在补一句哈,师兄,最好是不但能够用schema验证xml的有效性,而且能够不满足有效性,还能捕捉到哪里没有满足(我觉得可能是要写自己的myerrorhandler去继承errorhandler类)!万分感谢万分感谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  5.   


    parser.parse(xmlfile, new DefaultHandler());
    不应该用new DefaultHandler()
    应该生成一个自定义的DefaultHandler然后重写Error Warn FatalError 等方法
    parser.parse(xmlfile, new MydefineDefaultHandler());
    这样就可以了
    你可以试一下