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

如果您正在实现 ContentHandler,则必须使用SAXParseException来获取更多错误,或者使用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
}

通常来自 Locator 的列信息返回 -1。对于偏移精度,您必须使用扩展的 ContentHandler 或词法分析器:

  • 获取错误的行号
  • 使用词法分析器或正则表达式或其他方式使用行信息、属性(开始标记、结束标记)估计节点的位置。
于 2009-09-22T13:13:14.993 回答
0

根据您对环境的控制程度,有一种有些笨拙的方法可以做到这一点。Xerxes 2 XML 解析器是默认解析器的替代品,它在 Validator 上有一个属性来获取当前节点,因此如果您保留对 Validator 的引用(作为您设置的 ErrorHandler 的字段验证器,例如)你可以得到节点结构。以下是我在 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 回答
0

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

  1. 使用 validate 方法时使用 SAXSource。
  2. 使用错误处理程序的实现来捕获 SAXParseException。
于 2012-08-16T16:20:09.507 回答