2017-03-03 69 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部分。)