我正在使用xmllint --schema选项来验证我的XML
<XML>
<Active>True</Active>
</XML>
在我的架构文件中,我有以下描述Active元素的行。
<xsd:element name="Active" type="xs:boolean" />
当我运行xmllint时,我收到错误消息
/tmp/schema_validation.xml:73:元素 活动:架构有效性错误: 元素'活跃':'真'不是 原子类型的有效值 'XS:布尔'。
当我将XML更改为
时<Active>true</Active>
然后错误消息消失。
所以,它看起来像xsd:boolean意味着它全是小写的“true / false”而不是xmllint的“True / False”..我的问题是,如何使xmllint接受xsd的“True”:boolean类型?或者我可以使用哪些工具来验证这个XML?此时更改XML或架构不是我的选择。
谢谢!
答案 0 :(得分:99)
你做不到。
根据XML Schema specification,布尔值为true
或false
。 True
无效:
3.2.2.1 Lexical representation An instance of a datatype that is defined as ·boolean· can have the following legal literals {true, false, 1, 0}. 3.2.2.2 Canonical representation The canonical representation for boolean is the set of literals {true, false}.
如果您使用的工具真正验证了XML Schema标准,那么您无法说服它接受True作为布尔值。
答案 1 :(得分:50)
xs:boolean
是根据它接受的输入类型预定义的。如果您需要不同的东西,则必须定义自己的枚举:
<xs:simpleType name="my:boolean">
<xs:restriction base="xs:string">
<xs:enumeration value="True"/>
<xs:enumeration value="False"/>
</xs:restriction>
</xs:simpleType>
答案 2 :(得分:3)
如果您使用的是Linux,或者在Windows上提供了cygwin,则可以通过简单的sed脚本运行输入XML,该脚本将<Active>True</Active>
替换为<Active>true</Active>
,如下所示:
cat <your XML file> | sed 'sX<Active>True</Active>X<Active>true</Active>X' | xmllint --schema -
如果你不是,你仍然可以使用一个非验证的xslt pocessor(xalan,saxon等)在输入上运行一个简单的xslt转换,然后只将它传递给xmllint。
xsl应该包含类似下面的内容,对于上面列出的示例(xslt处理器应该支持2.0):
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="XML">
<xsl:for-each select="Active">
<xsl:value-of select=" replace(current(), 'True','true')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>