Java org.xml.sax.SAXParseException:cvc elt.1:找不到元素';tns:root#u元素';

Java org.xml.sax.SAXParseException:cvc elt.1:找不到元素';tns:root#u元素';,java,xml,xsd,schema,Java,Xml,Xsd,Schema,我在这上面花了两个小时。我无法找出发生此错误的原因。我有一个简单的xsd和xml代码 xml文件: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="root_element" type="string"/> </schema> 任何评论都会有帮助。关于我认为主要问题在于: dbf.

我在这上面花了两个小时。我无法找出发生此错误的原因。我有一个简单的xsd和xml代码

xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root_element" type="string"/>   
</schema>

任何评论都会有帮助。关于

我认为主要问题在于:

dbf.setValidating(true);
根据Java API:

指定此代码生成的解析器将进行验证 在解析文档时查看它们。默认情况下,该值设置为 错

注意这里的“验证”是指定义的验证解析器 在XML推荐中。换句话说,它本质上就是 控制DTD验证。(除了遗留的两个属性) 在JAXP 1.2中定义。)

使用现代模式语言,如W3CXMLSchema或RELAXNG 您可以将解析器配置为非验证解析器,而不是DTD 解析器将setValidating(boolean)方法保留为false,然后 使用setSchema(Schema)方法将架构与解析器关联

此外,您不需要:

dbf.setFeature(“http://apache.org/xml/features/validation/schema“,对);
您的工作代码可能只是(但是我不知道
CommodityPropsErrorHandler
类中有什么):

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
SchemaFactory s_工厂=
SchemaFactory.newInstance(xmlstants.W3C_XML_SCHEMA_NS_URI);
dbf.setSchema(s_factory.newSchema(新文件(schemafile));
DocumentBuilder db=dbf.newDocumentBuilder();
CommodityPropsErrorHandler cp_eh=新的CommodityPropsErrorHandler();
db.setErrorHandler(cp_eh);
Document doc=db.parse(新文件(props_文件));
这里是第二种替代方法,使用前面的
dbf.setValidating(true)(即,使用JAXP中的这两个属性,在Java API中提到):


这一行用于使验证名称空间感知。否则,它将给出文档中不存在的元素

dbf.setNamespaceAware(true);

那不可能是全部。在某个地方有一个对命名空间前缀
tns:
的引用,您还没有发布该前缀。
dbf.setValidating(true);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);

dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
    XMLConstants.W3C_XML_SCHEMA_NS_URI);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
    new File(schemafile));

DocumentBuilder db = dbf.newDocumentBuilder();
CommodityPropsErrorHandler cp_eh = new CommodityPropsErrorHandler();
db.setErrorHandler(cp_eh);
Document doc = db.parse(new File(props_file));
dbf.setNamespaceAware(true);