4

私は単純なスキーマバリデータメソッドを持っています:

// Throws runtime exception if anything goes wrong.
public void validate(String schemaURL, String xml) throws Throwable {
    SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance();
    SAXParser oSAXParser = null;
    oSAXParserFactory.setNamespaceAware(true);
    SchemaFactory oSchemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    oSAXParserFactory.setSchema(oSchemaFactory.newSchema(new URL(schemaURL)));
    oSAXParser = oSAXParserFactory.newSAXParser();
    SaxErrorHandler handler = new SaxErrorHandler();
    oSAXParser.parse(new InputSource(new StringReader(xml)),handler);
}

でホストされているスキーマがありますhttp://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="application">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="info"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="info">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

そのスキーマの次のインスタンスを観察します。

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://myserver.com/schemas/app-config/1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://myserver.com/schemas/app-config/1.0
        http://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd">
    <info
        name="Dummy Application"
    />
</application>

メソッドを渡すとvalidate、次のようになります。

String xmlInstance = readXMLIntoString();
String schemaURL = "http://myserver.com/schemas/app-config/1.0/app-config-1.0.xsd";

validate(schemaURL, xmlInstance);

次のエラーが表示されます。

org.xml.sax.SAXParseException: cvc-elt.1: 要素 'application' の宣言が見つかりません。

  • 私のスキーマに何か問題がありますか?
  • 私のインスタンスで何かが無効ですか?
  • URL で実際にスキーマをホストすることに問題はありますか (この例で使用されているものはモックアップですが、XSD ファイルはコードでヒットしている URL で実際にホストされていることを保証します)。

applicationバリデーターが宣言を見つけられないのはなぜですか?

4

2 に答える 2

3

XML スキーマにtargetNamespaceがありません。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://myserver.com/schemas/app-config/1.0"
  elementFormDefault="qualified">
  ...

XML スキーマでtargetNamespaceを宣言する代わりに、XML から膨大なジャンボをすべて削除できます。

<application>
  ...

それでも、最初の解決策に固執するようにしてください。

于 2012-06-02T18:18:18.020 に答える
2

私の最初の回答では、schemaLocation が間違っていると述べていましたが、これは実際に当てはまりますが、最初に提案した理由とは異なります。Kohanyi Róbert が言ったように、スキーマにtargetNamespace. 彼のアプローチに従ってスキーマを変更するか、 に置き換えschemaLocationてくださいnoNamespaceSchemaLocation

于 2012-06-02T17:57:31.437 に答える