如何在根据 XML 架构验证 XML 文件时获取错误的行号

2024-03-13

我正在尝试根据 W3C XML 架构验证 XML。

以下代码完成该工作并在发生错误时报告。但我无法获取错误的行号。它总是返回-1。

有没有简单的方法来获取行号?

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.w3c.dom.Document;
import org.xml.sax.SAXParseException;

    public class XMLValidation {

        public static void main(String[] args) {

            try {
                DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                Document document = parser.parse(new File("myxml.xml"));

                SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                Source schemaFile = new StreamSource(new File("myschema.xsd"));

                Schema schema = factory.newSchema(schemaFile);

                Validator validator = schema.newValidator();

                validator.validate(new DOMSource(document));

            } catch (SAXParseException e) {
                System.out.println(e.getLineNumber());
                e.printStackTrace();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

我找到了这个

http://www.herongyang.com/XML-Schema/Xerces2-XSD-Validation-with-XMLReader.html http://www.herongyang.com/XML-Schema/Xerces2-XSD-Validation-with-XMLReader.html

似乎提供了以下详细信息(包括行号)

Error:
   Public ID: null
   System ID: file:///D:/herong/dictionary_invalid_xsd.xml
   Line number: 7
   Column number: 22
   Message: cvc-datatype-valid.1.2.1: 'yes' is not a valid 'boolean' 
   value.

使用此代码:

/**
 * XMLReaderValidator.java
 * Copyright (c) 2002 by Dr. Herong Yang. All rights reserved.
 */
import java.io.IOException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
class XMLReaderValidator {
   public static void main(String[] args) {
      String parserClass = "org.apache.xerces.parsers.SAXParser";
      String validationFeature 
         = "http://xml.org/sax/features/validation";
      String schemaFeature 
         = "http://apache.org/xml/features/validation/schema";
      try {
         String x = args[0];
         XMLReader r = XMLReaderFactory.createXMLReader(parserClass);
         r.setFeature(validationFeature,true);
         r.setFeature(schemaFeature,true);
         r.setErrorHandler(new MyErrorHandler());
         r.parse(x);
      } catch (SAXException e) {
         System.out.println(e.toString()); 
      } catch (IOException e) {
         System.out.println(e.toString()); 
      }
   }
   private static class MyErrorHandler extends DefaultHandler {
      public void warning(SAXParseException e) throws SAXException {
         System.out.println("Warning: "); 
         printInfo(e);
      }
      public void error(SAXParseException e) throws SAXException {
         System.out.println("Error: "); 
         printInfo(e);
      }
      public void fatalError(SAXParseException e) throws SAXException {
         System.out.println("Fattal error: "); 
         printInfo(e);
      }
      private void printInfo(SAXParseException e) {
         System.out.println("   Public ID: "+e.getPublicId());
         System.out.println("   System ID: "+e.getSystemId());
         System.out.println("   Line number: "+e.getLineNumber());
         System.out.println("   Column number: "+e.getColumnNumber());
         System.out.println("   Message: "+e.getMessage());
      }
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在根据 XML 架构验证 XML 文件时获取错误的行号 的相关文章

随机推荐

  • 安卓。画布缩放和平移

    我创建了自定义视图 您可以在其中触摸和缩放它 大部分作品都是在这个的帮助下创作的post http android developers blogspot com 2010 06 making sense of multitouch htm
  • 休眠在批处理文件中

    当编写批处理文件以在 Windows 机器上自动执行某些操作时 我需要暂停其执行几秒钟 通常在测试 等待循环中 等待进程启动 当时 我能找到的最好的解决方案是使用 ping 我没有骗你 来达到预期的效果 我找到了一篇更好的文章here ht
  • 在 Redhat 6.3 上安装 R 3+

    我想在我的 Red hat 集群上安装 R 其版本如下 cat etc redhat release Red Hat Enterprise Linux Server release 6 3 Santiago 当我访问 R 的主页时 这就是他
  • CQL3 现在是否需要 Cassandra 的架构?

    上周我刚刚参加了 Cassandra 速成课程 从 Thrift API 到 CQL 再到摸索 SuperColumns 才知道我不应该使用它们 而应该使用复合键 我现在正在尝试 CQL3 似乎我无法再插入到架构中未定义的列 或者在sele
  • Django - 应用程序目录中的静态文件

    在开发环境中 我想使用应用程序目录中的静态文件 settings py SITE ROOT os path dirname os path realpath file STATIC ROOT os path join SITE ROOT s
  • 如何在android中实现将sqlite导出到excel/csv文件?

    我正在开发 Android 应用程序 其中 SQlite 作为数据库 我想以编程方式将某些结果从数据库导出为 excel 文件格式 想要将该 excel 存储到本地设备路径 我遇到过以下链接 在Android中以编程方式将SQlite数据库
  • 如何分别从每个父节点获取子节点?

    我有一些数据 Xml
  • 如何根据opencv中的某些条件修改Mat的值?

    在Matlab中a a gt 50 0可以替换所有元素a大于 50 到 0 我想对 Mat 做同样的事情OpenCV https www mathworks com matlabcentral fileexchange 47953 comp
  • 从 Excel 导入数据时出现 SQL 错误 [已关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在从 Excel 工作表导入数据 我正在努力解决以下问题 执行 错误 消息错误 0xc020901c 数据流任务 1
  • 递归地检查给定字符串是否是平衡括号字符串

    作为 java 新手 以及编程新手 我在处理分配给我们的作业时遇到了麻烦 作业分为 3 部分 以检查给定字符串是否具有平衡括号 规则 如下 abcdefksdhgs 是平衡的 aaa
  • jquery 数据表固定列未定义

    我正在尝试使用jquery 数据表插件 http www datatables net 和以下固定列示例 http www datatables net extras fixedcolumns 但我收到错误Error ReferenceEr
  • NHibernate 合并问题

    我试图用 NHibernate 表达以下 SQL 查询 DECLARE date DATETIME NULL SELECT ER Id ER DocumentDate FROM ExpenseReport ER WHERE ER Perio
  • 容器模板参数的Value_type

    在他今年的 Going Native 主题演讲中C 的本质 http channel9 msdn com Events GoingNative 2013 Opening Keynote Bjarne Stroustrup 转至 40 30
  • 如何确定 upsert 是否是 PostgreSQL 9.5+ UPSERT 的更新?

    可写 CTE 在 9 5 之前被认为是 UPSERT 的解决方案 如中所述在 PostgreSQL 中重复更新时插入 https stackoverflow com questions 1109061 insert on duplicate
  • 现有 R 图中的子图

    我有一个如下图所示的情节 对于这个图 我想在图中的某处添加类似的线图 右下或左下 我正在使用的子图的命令是 plot 1 121 sample 1 121 type l 它绘制在第一个的顶部 我需要它作为一个小图 位于左下角或右下角 有人可
  • 从外部 html 文件加载handlebars.js 模板没有显示任何内容

    这个问题有点考验我的 JS 技能 所以我可能会像白痴一样解释它 这是我的 JavaScript 用于从服务器获取 json 并尝试将其推送到模板中 Server Interface Start Access the web api for
  • 我可以使用 Xcode 模拟器测试重大变化吗?

    我想知道是否可以在 Xcode Simulator 中测试重大更改位置服务 startMonitoringSignificantLocationChanges 方法 或者它仅适用于实际设备 请注意 我已经在模拟器中尝试过它 但它不起作用 但
  • R 中取消嵌套列表并连接

    我希望取消嵌套 展平 并连接文本中的字符串 逗号分隔 tibble 示例数据 library tidyverse tibble person c Alice Bob Mary score list c Red Green Blue c Or
  • UTC 日期/时间字符串到时区

    如何将 UTC 日期 时间字符串 例如 2011 01 01 15 00 00 转换为 php 支持的任何给定时区 例如 America New York 或 Europe San Marino PHP s DateTime http ph
  • 如何在根据 XML 架构验证 XML 文件时获取错误的行号

    我正在尝试根据 W3C XML 架构验证 XML 以下代码完成该工作并在发生错误时报告 但我无法获取错误的行号 它总是返回 1 有没有简单的方法来获取行号 import java io File import javax xml XMLCo