2

私はxmlドキュメントを持っています:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Child name="MyType" compareMode="EQ"></Child>
</Root>

そして、次のxsdを使用してこのxmlを検証したいと思います。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="compareMode" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

検証しようとすると、次のエラーが発生します。

Exception in thread "main" org.xml.sax.SAXException: Validation failed against correct.xml. ErrorMessage:s4s-elt-schema-ns: The namespace of element 'Root' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.

私の質問は、なぜルートがスキーマの名前空間になければならないのかということです。それは私がxmlドキュメントを正しく検証していないということでしょうか?

public synchronized boolean isValid(String xmlFragment、File xmlSchema)throws SAXException、IOException {

// 1.W3CXMLスキーマ言語のファクトリを検索します

SchemaFactory factory = 
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// 2. Compile the schema. 

Schema schema = factory.newSchema(xmlSchema);

// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
Source source = new StreamSource(new ByteArrayInputStream(xmlFragment.getBytes()));

// 5. Check the document    
    validator.validate(source);        
    return true;
}
4

2 に答える 2

5

xmlSchemaは、表示されたスキーマではなく、W3Cによって公開された「スキーマドキュメントのスキーマ」を保持している可能性がありますか?エラーメッセージフラグメント「ErrorMessage:s4s-elt-schema-ns:」はこれを示唆しているようです。

于 2011-02-07T15:27:01.573 に答える
1

ドキュメントは定義されたスキーマの下で有効であるため、コードを含むものである必要があります。

(エラーメッセージで指定されている)必要な名前空間への唯一の明示的な参照は、SchemaFactory.newInstance呼び出し内にあります。空の( "")名前空間をそこに渡すとどうなりますか?

また、スキーマのXMLドキュメントで期待される名前空間を明示的に設定することもお勧めします。これを行うにはいくつかの方法があります。XMLSchema-namespaceのプレフィックスを選択したので、タグに追加することをお勧めしxmlns="" targetNamespace=""ます。<xs:schema

于 2011-02-07T14:53:04.253 に答える