gpt4 book ai didi

没有命名空间的 xml 的 Java xsd 验证

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:53 26 4
gpt4 key购买 nike

我想根据 XSD 架构验证 XML 文件。 XML 文件根元素没有任何 namespace 或 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 可以很好地验证包含的命名空间 header 等(通过 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 文件中声明的 namespace 与架构相匹配。重要的是:

<xml> ... </xml>

与此不一样:

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

因此您需要在 XML 文档中声明您的命名空间,否则它将与您的架构不对应,您将得到此错误。

关于没有命名空间的 xml 的 Java xsd 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com