当前位置: 首页 > 面试题库 >

不带名称空间的xml的Java xsd验证

充培
2023-03-14
问题内容

我想针对XSD架构验证XML文件。XML文件根元素没有任何名称空间或xsi详细信息。它没有属性,只是<root>

我已经尝试从http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html尝试以下代码,但运气不佳
cvc-elt.1: Cannot find the declaration of element 'root'

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

File schemaFile = new File("schema.xsd");

Schema xsdScheme = factory.newSchema(schemaFile);

Validator validator = xsdScheme.newValidator();

Source source = new StreamSource(xmlfile);

validator.validate(source);

xml可以使用包含的名称空间标头等(通过xmlspy添加)很好地验证,但是我想可以不用手动编辑源文件就可以声明xml名称空间了吗?

编辑和解决方案

public static void validateAgainstXSD(File file) {

    try {
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        File schemaFile = new File("path/to/xsd");

        Schema xsdScheme = factory.newSchema(schemaFile);

        Validator validator = xsdScheme.newValidator();

        SAXSource source = new SAXSource(
                new NamespaceFilter(XMLReaderFactory.createXMLReader()),
                new InputSource(new FileInputStream(file)));

        validator.validate(source,null);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

protected static class NamespaceFilter extends XMLFilterImpl {

    String requiredNamespace = "namespace";

    public NamespaceFilter(XMLReader parent) {
        super(parent);
    }

    @Override
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
        if(!arg0.equals(requiredNamespace)) 
            arg0 = requiredNamespace;
        super.startElement(arg0, arg1, arg2, arg3);
    }       
}

问题答案:

您需要解决两个独立的问题:

  1. 声明文档使用的名称空间。
  2. xsi:schemaLocation在文件中放置一个属性,以提示 (!) 模式在哪里。

您可以放心地跳过第二部分,因为该位置实际上只是一个提示。您不能跳过第一部分。XML文件中声明的名称空间与模式匹配。重要的是:

<xml> ... </xml>

不一样的 ,因为这:

<xml xmlns="urn:foo"> ... </xml>

因此,您需要在XML文档中声明您的名称空间,否则它将与您的模式不对应,并且会出现此错误。



 类似资料:
  • 我是XML新手。这是一个家庭作业。我已经尽了最大努力,但我无法让实例文档进行验证。我总是犯错误 “找不到元素'站点'的声明。 我想我可能错误地声明了一些名称空间或者schemaLocations。有人能给我指一下正确的方向吗? 作业步骤: > <块引用> 在sites.xml文件中,向根站点元素添加命名空间声明,将xs前缀与XML Schema命名空间的URI相关联。为文件指定默认命名空间http

  • 为什么我得到一个空的输出?当我删除xml中的xmlns部分时,输出是预期的,但是intellisense不再工作了。 仓库xml 仓库xsl

  • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

  • 问题内容: 我正在一个没有架构的项目中,我必须手动解析xml响应。我的问题是我无法使用xml注释获得一些价值。 例如,xml类似于: Java类是: 我可以获取操作和响应,但不能在responsedata中获取数字,有人可以告诉我如何处理using注释吗?太感谢了! 另一个问题是:我的响应数据中有多个…。如何获取Java代码中的所有值。 ->我解决了多个相同的标签,只需设置List,注释将自动生成

  • 我有一个来自外部endpoint的巨大XML响应。我想解析java类的XML响应。如果没有一个XML有名称空间,我就能够解析成相应的POJOS,直到那时一切都很好。 但是,响应可能仅在根元素中包含命名空间。例如,像这样 我可以保证没有一个内部xml元素会有更多的命名空间。 有没有办法实现这一点?我看到一些完全忽略命名空间的答案,但感觉不是很有说服力。有没有办法正确解析这些。 这是我为XML响应建模

  • 我正在尝试选择一个特定的