0

たとえば、バリデーターからノード構造などを取得できますか? リスナーやハンドラーのようなもの。例外は十分ではありません。エラーが発生したノードを選択する必要があります。それが私がこれまでに構築したものです。

def factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
def schema = factory.newSchema(new StreamSource(new FileReader("src/import.xsd")))
def validator = schema.newValidator()
try {
    validator.validate(new StreamSource(new FileReader("src/import.xml")))
    println "everything is fine"
} catch(SAXException e) {   
    println e
}

ありがとうございました。

4

4 に答える 4

1

解析時に検証します。Java のコードは次のとおりです。Groovy への変換は非常に簡単なはずです。

InputStream xml = // …
InputStream xsd = // …

SchemaFactory xsFact = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = xsFact.newSchema(new StreamSource(xsd));

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();

Document dom = db.parse(new InputSource(xml));
于 2009-09-22T12:08:47.367 に答える
0

同じ問題に遭遇し、以下を使用して解決しました。

  1. validate メソッドの使用時に SAXSource を使用しました。
  2. SAXParseException をキャプチャするためにエラー ハンドラの実装を使用しました。
于 2012-08-16T16:20:09.507 に答える
0

さらに多くのエラーを取得するにはSAXParseExceptionを使用するか、 ContentHandler を実装している場合はSAX ロケーターを使用する必要があります。例外は、エラーの詳細、行番号を提供します。

try{
  ...
}
catch(SAXParseException e){
   int lineNumber = e.getLineNumber();
   int columnNumber = e.getColumnNumber();
   String message = e.getMessage();
   // do something
}
catch(SAXException e){
   // what should we do?
   // if we're implementing ContentHandler 
   // we can use the org.xml.sax.Locator to get more info
}

通常、ロケーターからの列情報は -1を返します。オフセットの精度については、拡張された ContentHandler またはレクサーを使用する必要があります。

  • エラーの行番号を取得する
  • 行情報、属性(開始タグ、終了タグ)からノードの位置をレクサーや正規表現などで推定します。
于 2009-09-22T13:13:14.993 に答える
0

環境をどの程度制御できるかに応じて、これを行うにはやや厄介な方法があります。Xerxes 2 XML パーサーは、デフォルトのパーサーのドロップイン代替品であり、Validator に現在のノードを取得するプロパティがあるため、Validator への参照を (設定した ErrorHandler のフィールドとして) 保持する場合Validator など) ノード構造を取得できます。これが私がJavaで行った方法です:

...
  Validator validator = schema.newValidator();
  validator.setErrorHandler(new MyErrorHandler(validator));
...



public class MyErrorHandler implements ErrorHandler {
  private Validator validator;

  public AnnotatingErrorHandler(Validator v) {
    super();
    validator = v;
  }

  @Override
  public void error(SAXParseException e) throws SAXException {

    try {
      element = (Element)validator.getProperty("http://apache.org/xml/properties/dom/current-element-node");
    } catch (SAXNotRecognizedException e) {
      log(Level.SEVERE, "Xerxes 2 XML parser is required", saxnre);
    } catch (SAXNotSupportedException e) {
   ; // shouldn't happen in this context
    }
    ... // do stuff
  }
  ...
}
于 2009-11-17T17:46:05.783 に答える