webentwicklung-frage-antwort-db.com.de

xsd: Boolescher Elementtyp akzeptiert "true", aber nicht "True". Wie kann ich dafür sorgen, dass es akzeptiert wird?

Ich verwende die Option xmllint --schema, um mein XML zu validieren, das so aussieht

<XML>
<Active>True</Active>
</XML>

In meiner Schemadatei habe ich folgende Zeile, die das aktive Element beschreibt.

<xsd:element name="Active" type="xs:boolean" />

Wenn ich xmllint starte, erhalte ich eine Fehlermeldung mit der Aufschrift

/tmp/schema_validation.xml:73: element Active: Gültigkeitsfehler des Schemas: Element 'Active': 'True' ist kein gültiger Wert des atomaren Typs 'xs: boolean'.

Wenn ich das XML in ändere

<Active>true</Active>

Dann verschwindet die Fehlermeldung.

Es sieht also so aus, als ob xsd: boolean bedeutet, dass xmllint nur aus Kleinbuchstaben "true/false" und nicht aus "true/false" besteht. Oder gibt es verschiedene Tools, die ich verwenden kann, um diese XML zu validieren? Das Ändern von XML oder Schema ist derzeit nicht meine Option.

Vielen Dank!

50
Soichi Hayashi

Du kannst nicht.

Gemäß der XML-Schema-Spezifikation ist ein Boolescher Wert true oder false. True ist nicht gültig:

 
 3.2.2.1 Lexikalische Darstellung 
 Eine Instanz eines Datentyps, der als · boolescher · Datentyp definiert ist, kann die folgenden 
 Juristischen Literale haben (wahr, falsch, 1, 0}. 
 
 3.2.2.2 Kanonische Darstellung 
 Die kanonische Darstellung für Boolesche Werte ist die Menge von 
 Literalen {wahr, falsch}. 

Wenn das von Ihnen verwendete Tool wirklich mit dem XML-Schemastandard übereinstimmt, können Sie es nicht davon überzeugen, True für einen Booleschen Wert zu akzeptieren.

102
Cheeso

xs:boolean ist vordefiniert, welche Art von Eingabe akzeptiert wird. Wenn Sie etwas anderes benötigen, müssen Sie Ihre eigene Aufzählung definieren:

 <xs:simpleType name="my:boolean">
    <xs:restriction base="xs:string">
      <xs:enumeration value="True"/>
      <xs:enumeration value="False"/>
    </xs:restriction>
  </xs:simpleType>
50
Pavel Minaev

Wenn Sie unter Linux arbeiten oder Cygwin unter Windows verfügbar haben, können Sie das Eingabe-XML über ein einfaches sed-Skript ausführen, das <Active>True</Active> Durch <Active>true</Active> Ersetzt.

cat <your XML file> | sed 'sX<Active>True</Active>X<Active>true</Active>X' | xmllint --schema -

Wenn dies nicht der Fall ist, können Sie einen nicht validierenden xslt-Prozessor (xalan, saxon usw.) verwenden, um eine einfache xslt-Transformation für die Eingabe auszuführen, und diese erst dann an xmllint weiterleiten.

Was die XSL-Datei wie folgt enthalten sollte, für das oben aufgeführte Beispiel (der XSLT-Prozessor sollte 2.0-fähig sein):

<?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>
3