Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中验证时从XML获取架构信息_Java_Xml_Validation_Schema_Xml Validation - Fatal编程技术网

在Java中验证时从XML获取架构信息

在Java中验证时从XML获取架构信息,java,xml,validation,schema,xml-validation,Java,Xml,Validation,Schema,Xml Validation,我需要根据XML模式验证XML文件,以便从XML中获取模式信息 我有定义其名称空间的XML文档。像这样: <?xml version="1.0" encoding="UTF-8"?> <myelement xmlns="mynamespace"> </myelement> 这种方式是可行的,但有两个问题: 1) 我必须首先手动解析文档并创建模式,这有点笨拙,尽管理论上验证器拥有自动执行该操作所需的所有信息 2) 如果我验证文档对象,就不会得到正确的错误行号

我需要根据XML模式验证XML文件,以便从XML中获取模式信息

我有定义其名称空间的XML文档。像这样:

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

</myelement>
这种方式是可行的,但有两个问题:

1) 我必须首先手动解析文档并创建模式,这有点笨拙,尽管理论上验证器拥有自动执行该操作所需的所有信息

2) 如果我验证文档对象,就不会得到正确的错误行号。为了获得正确的行号,我必须对同一文档进行两次解析(第一次解析名称空间,第二次验证)

有谁知道更好的解决办法吗


在解析之前,是否有方法告诉解析器namespace1对应于schema1.xsd,namespace2对应于schema2.xsd等?或者我可以写一些解析器可以用来询问模式的回调(例如,我可以将LSResourceResolver提供给SchemaFactory)?

目前,解析器无法根据您的模式验证文档,因为模式不可用(而且解析器甚至没有配置来验证文档)。要自动实现这一点,我认为有两种选择:

  • 编辑XML以包含xsi:schemaLocation属性(但不确定是否支持该属性)

  • 为您的命名空间注册架构:

  • 代码:


    1.如果schemaLocation属性存在,则可以使其工作,但在我的情况下,它不存在,并且我无法强制使用此属性。当只给出名称空间时,我必须能够验证文档。2.这样做是可行的,但这是我的问题。在浏览XML文档之前,我不知道使用哪个模式。我要寻找的是一种在解析之前告诉解析器namespace1对应于schema1.xsd,namespace2对应于schema2.xsd等的方法,或者一种编写某种回调的选项,解析器可以使用它来询问模式。
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware( true );
    DocumentBuilder parser = dbf.newDocumentBuilder();
    Document document = parser.parse(new File("mydocument.xml"));
    String namespace = document.getChildNodes().item(0).getNamespaceURI();
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
    Schema schema = factory.newSchema(schemaFile);
    Validator validator = schema.newValidator();
    validator.setErrorHandler(new MyErrorHandler());
    validator.validate(new DOMSource(document));
    
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
    Schema schema = factory.newSchema(schemaFile);
    
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware( true );
    dbf.setValidating(true);
    dbf.setSchema(schema);