2011-02-24 16 views
2

で2つのスキーマに対して、JavaでXMLファイルを検証するには、私が同じ名前空間

  1. XMLドキュメント、
  2. ベースXSDファイルと
  3. 拡張XSDファイルを持っています。

両方のXSDファイルには1つの名前空間があります。ルートタグ下記た<xs:include schemaLocation="someschema.xsd"></xs:include>

XML文書(ファイル1):

ファイル3)は、ファイル2)を含むschemaFile2.xsdファイル3上で

<tagDefinedInSchema xmlns="http://myurl.com/myapp/myschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myurl.com/myapp/myschema schemaFile2.xsd"> 

Iは

  1. は、ファイル自体と

  2. 1つのファイルに2つのスキーマをマージを変更することなく、両方のスキーマに対するファイル1を検証する必要があります。

Javaでこれを行うにはどうすればよいですか?

UPD:これは私が使用しているコードです。

SchemaFactory schemaFactory = SchemaFactory 
     .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
DocumentBuilderFactory documentFactory = DocumentBuilderFactory 
     .newInstance(); 
documentFactory.setNamespaceAware(namespaceAware); 
DocumentBuilder builder = documentFactory.newDocumentBuilder(); 
Document document = builder.parse(new ByteArrayInputStream(xmlData 
     .getBytes("UTF-8"))); 

File schemaLocation = new File(schemaFileName); 
Schema schema = schemaFactory.newSchema(schemaLocation); 

Validator validator = schema.newValidator(); 

Source source = new DOMSource(document); 

validator.validate(source); 

UPD 2:これは私の作品:

public static void validate(final String xmlData, 
     final String schemaFileName, final boolean namespaceAware) 
     throws SAXException, IOException { 
    final SchemaFactory schemaFactory = SchemaFactory 
      .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    schemaFactory.setResourceResolver(new MySchemaResolver()); 
    final Schema schema = schemaFactory.newSchema(); 

    final Validator validator = schema.newValidator(); 
    validator.setResourceResolver(schemaFactory.getResourceResolver()); 

    final InputSource is = new InputSource(new ByteArrayInputStream(xmlData 
      .getBytes("UTF-8"))); 
    validator.validate(new SAXSource(is), new SAXResult(new XMLReaderAdapter())); 
} 



class MySchemaResolver implements LSResourceResolver { 

@Override 
public LSInput resolveResource(final String type, 
     final String namespaceURI, final String publicId, String systemId, 
     final String baseURI) { 
    final LSInput input = new DOMInputImpl(); 
    try { 
     if (systemId == null) { 
      systemId = SCHEMA1; 
     } 
     FileInputStream fis = new FileInputStream(
       new File("path_to_schema_directory/" + systemId)); 

     input.setByteStream(fis); 
     return input; 
    } catch (FileNotFoundException ex) { 
     LOGGER.error("File Not found", ex); 
     return null; 
    } 

} 

}

+0

ファイルを解析するためにどのようなメカニズムを使用していますか? – skaffman

+0

私の質問にコードを追加しました。 –

+0

コードschemaFileNameはschemaFile2.xsd(拡張XSDファイル)でなければなりません。 –

答えて

2

ここでは1つのスキーマがありますが、2つのスキーマ文書から作成されています。

スキーマをビルドするときにschemaFile2.xsdをAPIに指定すると、自動的にxs:includeを介して他のドキュメントがプルされます。これが起こっていないと思われる場合は、あなたがこれを信じる原因となっている症状を説明する必要があります。

+2

付属の文書を引き出しません。症状:「要素Xの定義が見つかりません」というエラーメッセージが表示され、その要素が含まれているXSDで定義されています。私はすでに私の問題を解決しました(上記UPD 2を参照)。 –

0

それは少し非効率的に見えるかもしれませんが、あなたは、スキーマAに対して検証ができなかった、スキーマを使用して新しいバリデータを作成しますBとそれも検証する?

+0

2番目のスキーマに最初のスキーマが含まれるため、これは機能しません。 2番目のスキーマに対してコードを検証すると、含まれているスキーマの要素が見つかりません。 –

+0

問題は、schema2からschema1を参照する方法がわからないことです。 –

関連する問題