如何获取 xsd 验证失败的无效 xml 文件的元素

2023-11-25

我目前正在使用 XSD 来验证我的 xml。这部分工作正常,我的问题是我想获取无效的标签/值的元素。

    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    XMLStreamReader reader = null;
    SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(xsdschemalocation);
    Validator validator = schema.newValidator(); 
    try
    {
        reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(new StringReader(xml)));
    } catch (XMLStreamException ex)
    {
        LogController.getLogger().logSEVERE("Unable to create the streamreader from the xml source", ex.getLocalizedMessage());
        return false;
    }
    try
    {
        validator.validate(new StAXSource(reader));
    }
    catch (IOException ex)
    {
        LogController.getLogger().logSEVERE("IOException in the validatation has been caused as the reader has become null", ex.getLocalizedMessage());
        return false;
    }
catch(SAXException saxe)
    {
        LogController.getLogger().logWARNING("Their is a validation error with the xml", saxe.getLocalizedMessage());
        //*****HERE I WANT THE TAG THAT HAS THE ERROR
        ClientCommunication.ErrorMessageForClient(VALIDATION_ERROR, socket);
        CloseClientConnection();
        return;
    }

我的不切实际的想法是在消息中查找单词“type”或“end-tag”并获取其后的值,但是我知道这不是一个好的做法!我觉得这很令人沮丧,因为我可以看到无效的标签,但无法获取它!

以下是我想要的元素的一些示例

1. Message: Element type "first" must be followed by either attribute specifications, ">" or "/>".

2. javax.xml.stream.XMLStreamException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 353; cvc-pattern-valid: Value '079e989989' is not facet-valid with respect to pattern '([0-9])+' for type 'phoneNumber'.

3. Message: The element type "firstLine" must be terminated by the matching end-tag "</firstLine>".

以下是您可以使用以下方法实现用例的方法:ErrorHandler:

我的错误处理程序

我建议实施ErrorHandler保留了对XMLStreamReader这样当一个SAXParseException发生时你可以询问XMLStreamReader获取有关元素的信息。如果您希望在抛出异常后停止解析,只需重新抛出SAXParseException在每个方法的末尾。

package forum11921190;

import javax.xml.stream.XMLStreamReader;
import org.xml.sax.*;

public class MyErrorHandler implements ErrorHandler {

    private XMLStreamReader reader;

    public MyErrorHandler(XMLStreamReader reader) {
        this.reader = reader;
    }

    @Override
    public void error(SAXParseException e) throws SAXException {
        warning(e);
    }

    @Override
    public void fatalError(SAXParseException e) throws SAXException {
        warning(e);
    }

    @Override
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(reader.getLocalName());
        System.out.println(reader.getNamespaceURI());
        e.printStackTrace(System.out);
    }

}

Demo

您设置了一个实例ErrorHandler on the Validator.

package forum11921190;

import javax.xml.XMLConstants;
import javax.xml.stream.*;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;

public class Demo {

    private static final StreamSource XSD = new StreamSource("src/forum11921190/schema.xsd");
    private static final StreamSource XML = new StreamSource("src/forum11921190/input.xml");

    public static void main(String[] args) throws Exception {
        SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(XSD);

        XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML);

        Validator validator = schema.newValidator();
        validator.setErrorHandler(new MyErrorHandler(reader));
        validator.validate(new StAXSource(reader));

    }

}

架构.xsd

下面是我在编写演示代码时使用的示例 XML 架构。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com"
    xmlns:tns="http://www.example.com"
    elementFormDefault="qualified">
    <element name="root">
        <complexType>
            <sequence>
                <element name="foo" type="string"/>
                <element name="bar" type="int"/>
            </sequence>
        </complexType>
    </element>
</schema>

输入.xml

以下是一些示例输入。这bar元素包含无效内容。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com">
    <foo>valid</foo>
    <bar>invalid</bar>
</root>

Output

以下是运行演示代码的输出:

bar
http://www.example.com
org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'invalid' is not a valid value for 'integer'.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3103)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3013)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2156)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824)
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565)
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:261)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleEndElement(StAXStream2SAX.java:295)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:167)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
    at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:94)
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:118)
    at javax.xml.validation.Validator.validate(Validator.java:127)
    at forum11921190.Demo.main(Demo.java:26)
bar
http://www.example.com
org.xml.sax.SAXParseException: cvc-type.3.1.3: The value 'invalid' of element 'bar' is not valid.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3104)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3013)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2156)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824)
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565)
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:261)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleEndElement(StAXStream2SAX.java:295)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:167)
    at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
    at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelper.validate(StAXValidatorHelper.java:94)
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:118)
    at javax.xml.validation.Validator.validate(Validator.java:127)
    at forum11921190.Demo.main(Demo.java:26)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 xsd 验证失败的无效 xml 文件的元素 的相关文章

随机推荐

  • 如何从 C# 调用 MS Access 数据库宏

    我只是想知道是否可以从外部调用 MS Access 数据库中的模块函数或宏 使用C Thanks 是的 您可以运行宏 This Article 仅可通过 archive org 获取 显示您需要的一切
  • 我们如何计算处理时间?

    我创建了一个PopupPanel并已展示出来 我想在一分钟过去后隐藏它 在那一分钟内 该过程不应停止或暂停 我怎样才能实现这种行为 GWT 有自己的实现Timer 这是一个非常小的例子 public void onModuleLoad fi
  • 使用 Node.js 管理 sdk 创建令牌时的 Firebase REST 身份验证

    我知道这个问题在这里被问了很多 但我似乎仍然找不到可以解决我的问题的确切答案 我希望通过添加 access token 参数使用 REST 调用访问 Firebase access token 是使用 Node js Admin SDK 创
  • MICE 不会估算某些列,但也不会给出错误

    我知道以前曾问过类似的问题 例如 1 2 3 但我还是不明白为什么mice即使我尝试像示例中那样的无条件均值 也无法预测缺失值1 我的稀疏矩阵是 k1 k3 k5 k6 k7 k8 k11 k12 k13 k14 k15 1 NA NA N
  • 将单词(字符串)转换为 Int

    我确信这已经被做过一百次了 但我希望有一种非常简单的方法来完成这个任务 我想将单词更改为整数 就像下面的例子 One 1 Two 2 Three 3 所以基本上 如果我有字符串 One 它会转换为 1 即使我可以返回字符串 1 我也可以将其
  • Java:如何查看代码的哪些部分运行最多? (分析)

    我正在用 Java 编写一个简单的跳棋游戏 当我将鼠标悬停在主板上时 我的处理器性能提升至 50 核心上为 100 我想找出我的代码的哪一部分 假设是我的错 在此期间正在执行 我尝试过调试 但在这种情况下逐步调试效果不太好 有没有什么工具可
  • 获取当前正在运行的活动的实例?

    我想做的是将运动事件分派给当前正在运行的活动 我从这段代码中获取了当前活动的 ComponentName ActivityManager am ActivityManager getSystemService ACTIVITY SERVIC
  • 排除类型的重载的类型注释(某些类型与其他类型)

    我正在尝试使用 overload传达调用函数的不同方式 但是通过简单的代码可以轻松传达什么else声明在类型注释中是不可能的 如果没有 else MyPy 正确地 会抱怨重载版本不匹配 例如 请参见下面的代码片段 error Overloa
  • 错误 X3000:着色器文件中存在非法字符

    我粘贴了一行着色器代码 现在我的项目无法工作 我删除了受污染的代码行 我已经按照 VS Notepad 和 Notepad 的建议从头开始多次重写着色器Unity 论坛 我在 Notepad 中使用了十六进制编辑器视图来排除前两个字节不是0
  • CA2000 将对象引用传递给 C# 中的基本构造函数

    当我通过 Visual Studio 的代码分析实用程序运行一些代码时 我收到一条警告 我不确定如何解决 也许这里有人遇到过类似的问题 解决了它 并愿意分享他们的见解 我正在编写一个在 DataGridView 控件中使用的自定义绘制单元格
  • 为什么VS中的Debug模式比Release慢?

    我已经用谷歌搜索过这个问题 通常答案相当复杂 而且我并不真正理解所有的行话 有没有简单的解释为什么调试模式这么慢 为什么不总是在发布版本中运行呢 调试模式已关闭所有优化 以确保连接的调试器按预期工作 一个版本将会开启很多优化 比这更简单的我
  • 清除 Java 缓存

    我想知道如何使用 Java 代码或 CMD 行代码清除 Java 缓存 这应该在 Windows 7 及以上版本的 Microsoft Windows 计算机上完成 这应该在多台计算机上完成 因此文件路径会有所不同 该应用程序使用 Java
  • 查询GAE数据存储时如何修复索引错误?

    当我尝试对按日期排序的数据存储运行查询时 出现以下错误 NeedIndexError no matching index found The suggested index for this query is kind Message pr
  • 根据 bin 大小将列表分为多个列表

    我有一个包含超过 100 000 个值的列表 我需要根据特定的 bin 宽度 例如 0 1 将列表划分为多个较小的列表 谁能帮我写一个Python程序来做到这一点 我的清单看起来像这样 0 234 0 04325 0 43134 0 315
  • .R 脚本文件位于 PC 上的哪里?

    我想找到用于 R 中计算的脚本 R 文件的位置 我知道通过输入对象函数 我将获得正在运行的代码 然后我可以复制 编辑并将其另存为新的脚本文件并使用它 要求查找 foo R 文件的原因是 好奇心 了解数值计算中使用的算法是什么 更直接的是 函
  • C++ Visual Studio 编译错误

    我收到以下编译错误 致命错误 C1189 error 错误 使用 C 运行时库内部头文件 我对此完全不知道 谁能解释一下吗 完整的错误 C Program Files Microsoft Visual Studio 8 VC ce incl
  • 使用一次性使用令牌将 Auth0 实现到 chrome 扩展中

    我正在制作一个 chrome 扩展程序 我想为我的 chrome 扩展程序创建一个安全方法 以阻止它在没有我参与的情况下被共享 我有一个想法在某个地方生成一个令牌 通常是一些后端 也许是网站的服务器 该服务器获取我用 worpress 构建
  • 跨不同类加载器覆盖默认访问器方法会破坏多态性

    我在尝试使用以下方法重写方法时遇到了奇怪的行为默认访问器 ex void run 根据Java规范 如果类属于同一个包 则类可以使用或覆盖基类的默认成员 当所有类从同一个类加载器加载时 一切正常 但是如果我尝试从中加载子类separate类
  • Windows 上缺少“magic”库的文件

    我需要获取 Windows 上某些文件的 mime 类型 所以我已经安装了python magic 在 32 位 python 2 7 3 上 这取决于unixmagic图书馆 作者指示获取regex2 dll zlib1 dll and
  • 如何获取 xsd 验证失败的无效 xml 文件的元素

    我目前正在使用 XSD 来验证我的 xml 这部分工作正常 我的问题是我想获取无效的标签 值的元素 InputSource is new InputSource is setCharacterStream new StringReader