2017-03-03 42 views
0

试图了解XML架构扩充如何工作。从这个链接XML架构扩充

引用: https://www.w3.org/TR/2001/REC-xmlschema-1-20010502/

2.1 XML模式 的概述一个XML模式包括组件,诸如类型定义和元素声明的。这些可用于评估格式良好的元素和属性信息项(如[XML-Infoset]中定义的)的有效性,并且可以指定这些项及其后代的增量。 这种增强使明确的信息可能已经隐含在原始文档中,例如属性和元素的标准化和/或默认值以及元素和属性信息项的类型。

从这个链接: https://www.ibm.com/developerworks/library/x-javaxmlvalidapi/#validation

一些模式做的比验证了。除了为文档是否有效这个问题提供真实的错误答案之外,他们还会通过附加信息来扩充文档。例如,他们可以提供默认的属性值。 它们也可能将类型如int或gYear分配给元素或属性。验证器可以创建这样的类型增加的文档并将它们写入到javax.xml.transform.Result对象中。

所以我会假设,如果我验证对一个模式的XML文档,会产生一种增强的XML文档:

<thisIsAstring>Abc</thisIsAstring> 

成为

<thisIsAstring type="String">Abc</thisIsAstring> 

以上的假设,因为我还没有得到它的工作。

当我执行下面的代码时,结果包含或多或少与源相同。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    DocumentBuilder parser = dbf.newDocumentBuilder(); 
    Document document = parser.parse(new InputSource(new StringReader(inputMessage))); 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Source schemaSource = new SAXSource(new InputSource(new StringReader(inputSchema)));    
    Schema schema = factory.newSchema(schemaSource); 
    Validator validator = schema.newValidator(); 
    DOMResult result = new DOMResult(); 
    DOMSource source = new DOMSource(document); 
    validator.validate(source,result); 

为什么结果不增强?我错过了什么?

回答

0

模式验证程序(PSVI属性)添加到文档树中的额外属性不是属性。它们的添加方式和访问方式因架构处理器而异,您可能需要使用API​​请求处理。对于Xerces的,有关于如何访问这里的PSVI信息:

http://xerces.apache.org/xerces2-j/faq-xs.html

如果使用撒克逊为您架构验证,您可以捕获结果的树,其中的NodeInfo.getSchemaType()方法返回节点的类型注释(但是,撒克逊不提供完整的PSVI,仅限于XSLT和XQuery规范所要求的PSVI部分。)