سؤال

هل يمكنني الحصول على بنية العقدة أو شيء من هذا القبيل من المصدق؟ شيء مثل مستمع أو معالج. الاستثناء لا يكفي. لا بد لي من تحديد العقدة حيث حدث الخطأ. هذا ما أقوم به حتى الآن.

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
}

شكرا لك.

هل كانت مفيدة؟

المحلول

التحقق من صحة عند تحليل. إليك رمز في 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));

نصائح أخرى

عليك استخدام saxparseException. للحصول على المزيد من الأخطاء أو ساكس محدد إذا كنت تنفذ Contenthandler، وربما Lexer. سوف يمنحك الاستثناء تفاصيل حول الخطأ، رقم السطر.

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. وبعد للحصول على الدقة Offset، عليك إما استخدام محدلة موسعة أو Lexer:

  • الحصول على عدد سطر الخطأ
  • قم بتقدير موقف العقدة مع معلومات الخط، والسمات (علامة البدء، علامة النهاية) باستخدام أجهزة إرسال أجهزة Lexer أو تعبيرات منتظمة أو أي شيء آخر.

اعتمادا على مقدار التحكم الذي لديك حول البيئة، هناك طريقة كشك إلى حد ما للقيام بذلك. ال Xerxes 2. محلل XML، وهو استبدال انخفاض في المحفنة الافتراضي، لديه خاصية في المصدق للحصول على العقدة الحالية، لذلك إذا احتفظت بالرجوع إلى Validator (كحقل للخطأ الذي قمت بتعيينه في Validator، على سبيل المثال) يمكنك الحصول على بنية العقدة. إليك كيف فعلت ذلك في جافا:

...
  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
  }
  ...
}

جاء عبر نفس المشكلة وحلها باستخدام ما يلي.

  1. تستخدم Saxsource عند استخدام طريقة التحقق من الصحة.
  2. استخدام تطبيق معالج الخطأ لالتقاط SaxparseException.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top