从sax验证器获取更多信息

时间:2009-09-22 11:43:47

标签: java xml groovy xsd sax

我可以从验证器获得节点结构或类似的东西吗?像监听器或处理程序的东西。例外是不够的。我必须选择发生错误的节点。那是我到目前为止所建立的。

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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

如果要实现ContentHandler,可能需要使用 SAXParseException 来获取更多错误,或使用SAX locator,可能还有词法分析器。该例外将为您提供有关错误,行号的详细信息。

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或词法分析器:

  • 获取错误的行号
  • 使用词法分析器或正则表达式或其他内容估计节点与行信息,属性(开始标记,结束标记)的位置。

答案 2 :(得分: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
  }
  ...
}

答案 3 :(得分:0)

遇到同样的问题并使用以下方法解决了这个问题。

  1. 使用验证方法时使用SAXSource。
  2. 使用错误处理程序实现捕获SAXParseException。