我知道您可以使用xmllint
命令来验证local xsd files或xsd网络文件位置,但我想要做的是指示xmllint根据其“内部指定的”xsd验证XML文件,例如此XML指定了XSD位置:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ord-archive:XXX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://somewhere/something.xsd">
...
有没有办法使用xmllint并指定“验证”其内部指定的schemaLocation?
xsi:schemaLocation
应该包含一个URI列表,语义上两个一组。出现在奇数位置的每个URI指定一个名称空间,出现在下一个偶数位置的URI指定用于此名称空间的模式的位置提示。位置提示可以是本地的或远程的。
这是一个有三个名称空间的示例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ord-archive:XXX
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ord-archive="http://www.example.com/namespace"
xmlns:prefix="http://www.example.com/another-namespace"
xmlns:other-prefix="http://www.example.com/and-another-namespace"
xsi:schemaLocation="
http://www.example.com/namespace
http://somewhere.example.com/something.xsd
http://www.example.com/another-namespace
some-relative-path-to-a-directory/some-local-file.xsd
http://www.example.com/and-another-namespace
file:///some-absolute-path-to-a-directory/some-local-file.xsd">
<!-- the document itself, which contains elements in the three
namespaces, referenced with the bound prefixes. -->
</ord-archive:XXX>
XML Schema规范为验证引擎留下了一定程度的自由度,因此理论上它们可能会或可能不会遵循提示,它们可能会使用某些名称空间的缓存版本等。但是,在实践中,大多数验证引擎都会使用您的提示或提供特定于实现的控制其行为的方式。
在问题中的链接下给出的示例使用xsi:noNamespaceSchemaLocation
,其中包含没有目标命名空间的模式的位置提示。
似乎没有命令行选项来执行我想要的操作(使用XML位置提示自动下载xsd等)。但是您可以手动创建XSD文件并将其传递给命令行xmllint --schema xxx
,如果需要多个,可能会创建一个“过度拱形”的XSD:https://stackoverflow.com/a/30340341/32453