Xmllint --schemaオプションを使用して、このようなXMLを検証しています
<XML>
<Active>True</Active>
</XML>
スキーマファイルには、アクティブな要素を説明する次の行があります。
<xsd:element name="Active" type="xs:boolean" />
Xmllintを実行すると、エラーメッセージが表示されます
/tmp/schema_validation.xml:73:要素のアクティブ:スキーマの妥当性エラー:要素の「アクティブ」:「True」はアトミックタイプ「xs:boolean」の有効な値ではありません。
XMLを変更するとき
<Active>true</Active>
その後、エラーメッセージが消えます。
だから、xsd:booleanはすべて小文字の「true/false」であり、xmllintでは「True/False」ではないように見えます。または、このXMLを検証するために使用できるさまざまなツールがありますか? XMLまたはスキーマを変更することは、現時点では私のオプションではありません。
ありがとう!
できません。
XML Schema specification によると、ブール値はtrue
またはfalse
です。 True
は無効です:
3.2.2.1字句表現 ・boolean・として定義されているデータ型のインスタンスは、 に続く正当なリテラル{true、false、1、 0}。 3.2.2.2正規表現 ブール値の正規表現は、 リテラル{true、false}のセットです。
使用しているツールがXMLスキーマ標準に対して真に検証されている場合、ブール値に対してTrueを受け入れるように説得することはできません。
xs:boolean
は、それが受け入れる入力の種類に関して事前定義されています。別の何かが必要な場合は、独自の列挙を定義する必要があります。
<xs:simpleType name="my:boolean">
<xs:restriction base="xs:string">
<xs:enumeration value="True"/>
<xs:enumeration value="False"/>
</xs:restriction>
</xs:simpleType>
Linuxを使用している場合、またはWindowsでcygwinを使用できる場合は、次のように<Active>True</Active>
を<Active>true</Active>
に置き換える単純なsedスクリプトを介して入力XMLを実行できます。
cat <your XML file> | sed 'sX<Active>True</Active>X<Active>true</Active>X' | xmllint --schema -
そうでない場合でも、未検証のxsltプロセッサ(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>