如何使用xmllint验证内部指定的xsd?

时间:2017-06-14 22:27:00

标签: xml validation xsd xmllint

我知道您可以使用xmllint命令来验证local xsd files或针对xsd网络文件位置,但我想要做的是指示xmllint验证XML文件它的内部指定" xsd,例如此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并指定&#34;验证&#34;反对其内部指定的schemaLocation?

2 个答案:

答案 0 :(得分:1)

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,其中包含没有目标命名空间的架构的位置提示。

答案 1 :(得分:1)

似乎没有命令行选项来执行我想要的操作(使用XML位置提示自动下载xsd&#39;等)。但是您可以手动创建XSD文件并将其在命令行上传递给xmllint --schema xxx,可能会创建一个&#34; over arching&#34; XSD如果您需要多个:https://stackoverflow.com/a/30340341/32453