我可以从验证器获得节点结构或类似的东西吗?像监听器或处理程序的东西。例外是不够的。我必须选择发生错误的节点。那是我到目前为止所建立的。
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
}
谢谢。
答案 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)
遇到同样的问题并使用以下方法解决了这个问题。