gpt4 book ai didi

Java SAXParser 误报

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:55 32 4
gpt4 key购买 nike

我正在尝试构建我的第一个 XML 模式 validator 作为我的代码库和许多项目中的可重用组件。我花了一整天的时间尝试遵循示例并对其进行编码,现在已经启动并运行了概念验证。

唯一的问题是,它给了我误报:它验证 XML 实例绝对应该失败。我已经在 3 个模式上对其进行了测试:1 个模式与它配合得很好,现在它在最后两个模式中表现不佳(误报)。我相信这是因为我尝试的第一个模式/实例对非常简单。我现在正尝试将它用于更复杂的示例,但它令人窒息。

这是完成 SAX 验证的 validate 方法的主体:

schema = getSchemaAsString();
targetXml = "ijeioj489fu4u8";

SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance();
SAXParser oSAXParser = null;
oSAXParserFactory.setNamespaceAware(true);

try
{
SchemaFactory oSchemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
oSAXParserFactory.setSchema(oSchemaFactory.newSchema(new SAXSource(new InputSource(new StringReader(schema)))));

oSAXParser = oSAXParserFactory.newSAXParser();

DefaultHandler handler = new DefaultHandler();

oSAXParser.parse(new InputSource(new StringReader(targetXml)), handler);
}
catch(Exception oException)
{
throw oException;
}

schematargetXml 是内存中的 XML 字符串(不是 文件 URI),它们具有以下值:

架构 字符串:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="PayloadMessage">
<xs:complexType>
<xs:sequence>
<xs:element name="MessageID" type="xs:long"/>
<xs:element name="Timestamp" type="xs:long"/>
<xs:element name="MessageAction" type="xs:string"/>
<xs:element name="ContentType" type="xs:string"/>
<xs:element name="ContentID" type="xs:string"/>
<xs:element name="Payload" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

显然,给定的 targetXml 应该在其给定模式下失败。 不会。在 SAX 内容中的任何地方都不会抛出异常。

我有一种感觉我需要对 DefaultHandler 做些什么,但不确定...我去了 http://www.w3.org/2001/03/webdata/xsv并确认我的架构有效。

有什么事情会突然发生在任何人身上吗?提前致谢!

最佳答案

您必须设置一个将抛出 SAXException 的错误处理程序。默认行为是尝试解析文档,即使它无效。 DefaultHandler 实现了 ErrorHandler,但是发生错误或警告时的实现什么都不做

Javadoc WARNING: If an application does not register an ErrorHandler, XML parsing errors will go unreported, except that SAXParseExceptions will be thrown for fatal errors. In order to detect validity errors, an ErrorHandler that does something with error() calls must be registered.

我推荐了这个优秀的tutorial带有 XML 验证示例。这对我很有帮助。

关于Java SAXParser 误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437198/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com