- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用这段代码(如下)验证此 SOAP Envelope
时遇到问题。
我得到的错误是:
org.xml.sax.SAXParseException; cvc-elt.4.2: Cannot resolve 'ipo:UKAddress' to a type definition for element 'shipTo'.
SOAP XSD 将 Body
定义为:
<xs:complexType name="Body">
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
我的期望是“lax”应该验证它是否有定义,但如果没有定义则忽略。但是,xsi:type="ipo:UKAddress"
的情况并非如此。我只验证 SOAP Envelope
- 而不是 Body
。
它看起来像是 xerces-j 中的一个错误。在同一代码块中,XMLSchemaValidator.java :2152 在引发错误之前实际上检查了 processContents:
else if (wildcard != null && wildcard.fProcessContents == XSWildcardDecl.PC_STRICT) {
鉴于,XMLSchemaValidator.java :2178 没有进行这样的检查,无论如何都会抛出。
fCurrentType = getAndCheckXsiType(element, xsiType, attributes);
对我来说,它看起来像是 xerces-j 中的一个错误。另外,Java 8 中也存在这个问题。如果有任何帮助或确认这确实是一个错误,我们将不胜感激。
package com.example.xmlvalidate;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.CodeSource;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
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.SAXException;
public class Validate {
private static final String envelope =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soapenv:Envelope \n" +
" xmlns=\"http://www.w3.org/2001/XMLSchema\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
" >\n" +
" <soapenv:Body>\n" +
" <ipo:purchaseOrder xmlns:ipo=\"http://www.example.com/IPO\">\n" +
" <shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">\n" +
" <name>Helen Zoe</name>\n" +
" <street>47 Eden Street</street>\n" +
" <city>Cambridge</city>\n" +
" <postcode>CB1 1JR</postcode>\n" +
" </shipTo>\n" +
" </ipo:purchaseOrder>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>";
private static final String SOAP_1_1_ENVELOPE =
"http://schemas.xmlsoap.org/soap/envelope";
protected static final String W3C_XML_SCHEMA =
"http://www.w3.org/2001/XMLSchema";
public static void validate() throws ParserConfigurationException, SAXException, IOException, TransformerException {
final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setValidating(false);
final Class<?> clazz = documentBuilderFactory.getClass();
final CodeSource source = clazz.getProtectionDomain().getCodeSource();
System.out.println("Document builder implementation: " + clazz.getName() + " from : " + (source == null ? "JRE" : source));
final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
final InputStream is = new ByteArrayInputStream(envelope.getBytes(StandardCharsets.UTF_8));
final Document document = documentBuilder.parse(is);
final DOMSource domSource = new DOMSource(document);
final StreamSource streamSource = new StreamSource(new URL(SOAP_1_1_ENVELOPE).openStream());
final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Schema schema = schemaFactory.newSchema(streamSource);
final Validator validator = schema.newValidator();
validator.validate(domSource);
}
}
最佳答案
简短回答:在这种情况下,Xerces 要么毫无疑问是正确的,要么不能证明是错误的。
长答案:
您没有指定您使用的是 XSD 1.0 还是 XSD 1.1。
在 1.0 中,规范对于 xsi:type 属性(其 QName 值未解析为架构中的类型定义)的有效性的影响有些不清楚。验证规则的一种自然阅读:3.3.4 中的模式有效性评估(元素)是当xsi:type
发生时,它必须解决(注意文本中一致性要求和有效性要求之间的轻微混淆)。该规则的另一种解读是,如果验证规则的第 1.2.1.2.3 条不适用,那么显然第 1.2.1.2、1.2 和 1 条也不适用,这得出的结论是该元素应该是宽松的评估。
相同的两个读数适用于同一部分中的“验证规则:元素本地有效(元素)”的第 4.2 条。该子句表示 xsi:type 的值“必须解析为类型定义”,这意味着如果 xsi:type 值未解析,则该元素无效,或者(根据对规则的不同解读)该元素无效如果该元素显然不是(已知)针对指示的类型在本地有效。
在 1.1 中,规则已被重写并且可能变得更加清晰。如果 xsi:type 的值是无法解析为类型定义的 QName,则会计算回退类型,并根据回退类型验证该元素;在您想到的情况下,该类型将是 xsd:anyType。但 1.1 也非常明确地指出,在这种情况下,xsi:type 属性本身无效(验证规则的第 5 条:3.2.4 中的属性本地有效。
因此,根据 XSD 1.1 的规则,很明显 Xerces 正确地将输入标记为无效,尽管错误代码可能更合理的是不同的代码。
如果您使用的是 XSD 1.0,从错误代码中可以清楚地看出,Xerces 正在获取非解析 xsi:type 值的第一个 View ,并将其视为有效性错误。我认为很难从规范文本中证明这是唯一可能的解释,但要证明它是错误的就更难了:这显然是对规范的合理解释。如果您希望忽略 xsi:type 的问题并且不将其视为有效性错误,则需要使用跳过通配符,而不是宽松的通配符。 (当然,您可以为 SOAP 负载声明您自己的元素包装器,在其内容模型中使用跳过通配符进行声明,从而强制执行您想要的验证行为。)
关于java - Xerces-J 对未解析的 xsi :type? 的宽松验证失败是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592309/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!