鉴于以下数据
$ cat data.xml
<data>
<price>10.50</price>
<price>5.50</price>
</data>
选项 1:一个线性 xpath 检查
以下 xmllint 程序会找到有问题的 XML 标记:
$ echo "cat //price[text()<=6.50]" | xmllint --shell data.xml | grep "<price>" && echo "found"
<price>5.50</price>
found
“grep”命令的退出代码可以在 shell 脚本中用于测试 XML 是否被验证。
选项 2:生成 XML 模式
以下 shell 脚本生成一个 XML 模式,用于检查整个文档并包括对价格标签值的范围限制:
#!/bin/bash
LIMIT=$1
cat << EOF > data.xsd
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="price">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:maxInclusive value="$LIMIT"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
EOF
xmllint --schema data.xsd data.xml
运行如下:
$ ./validate.sh 6.5
<?xml version="1.0"?>
<data>
<price>10.50</price>
<price>5.50</price>
</data>
data.xml:2: element price: Schemas validity error : Element 'price': [facet 'maxInclusive'] The value '10.50' is greater than the maximum value allowed ('6.5').
data.xml:2: element price: Schemas validity error : Element 'price': '10.50' is not a valid value of the local atomic type.
data.xml fails to validate