2011-02-01 26 views
3

想知道是否有任何方法可以解析xsd文件,並且xsd是同時在原始xsd中導入的,因此我可以直接訪問導入的元素XSD。有沒有任何框架可以實現這一點?在同一模式中解析模式和導入

只是,我想分析我的意思

從XSD的例子:

<xsd:import namespace="..." schemaLocation="anotherFile.xsd">

<xsd:element ref="anElement" />

從該公司在解析文件導入的XSD

<xsd:element name="anElement">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="THIS" />
<xsd:enumeration value="IS" />
<xsd:enumeration value="THE" />
<xsd:enumeration value="ELEMENTS" />
<xsd:enumeration value="I" />
<xsd:enumeration value="WANT" />
<xsd:enumeration value=":-)" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

所以,我想是可以訪問的進口XSD當我通過某種內聯或某事的解析原始XSD :-)

元素這是可能的某種方式?

回答

2

是的,你只需要實現一個LSResourceResolver的類,將能夠從架構位置讀取指定:

/** 
* This function validates a DomResult. T 
* 
* @param domResult 
* @param schemaFile path to the schmea file to validate against. 
* @throws org.xml.sax.SAXException 
* @throws java.io.IOException 
* 
*/ 
protected void validateDomResult(DOMResult domResult, String schemaFile) throws SAXException, IOException, Exception { 

    Schema schema = createSchema(schemaFile); 
    javax.xml.validation.Validator validator = schema.newValidator(); 
    ErrorHandler mySchemaErrorHandler = new LoggingErrorHandler(); 
    validator.setErrorHandler(mySchemaErrorHandler); 
    DOMSource domSource = new DOMSource(domResult.getNode()); 
    validator.validate(domSource); 
    if (((LoggingErrorHandler) mySchemaErrorHandler).isError()) { 
     throw new Exception("Validation Error"); 
    } 
} 

/** 
* 
* @param baseSchemaFilePath 
* @return 
* @throws java.lang.Exception 
* 
*/ 
protected Schema createSchema(String baseSchemaFilePath) throws Exception { 

    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    LSResourceResolver resourceResolver = (LSResourceResolver) new LocalSchemaLSResourceResolver(); 
    factory.setResourceResolver(resourceResolver); 
    Schema schema = factory.newSchema(new File(baseSchemaFilePath)); 

    return schema; 
} 

下面是一個簡單的LSResourceResolver的實現,尋找模式在一個xsd目錄中的類路徑:

public class LocalSchemaLSResourceResolver implements LSResourceResolver{ 

    protected final Log logger = LogFactory.getLog(getClass()); 

    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { 

     LSInput input = new DOMInputImpl(); 
     try { 
      FileInputStream fis = new FileInputStream(new File("classpath:xsd/" + systemId)); 

      input.setByteStream(fis); 
      return input; 
     } catch (FileNotFoundException ex) { 
      logger.error("File Not found", ex); 
      return null; 
     } 

    } 
} 
+0

感謝您的好評。我通過使用xson,Xml Schema Object Model解決了這個問題。它對fr架構有很大的支持。 –

1

看起來您需要JAXB才能將您的模式(包括導入的模式)轉換爲Java類。

+0

JAXB可能會工作,但它不適合此任務,因爲解析必須動態完成。 –

1

這對我的作品時,XSD文件或者在本地/ src目錄/主/資源目錄或裝在一個罐子裏:

final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
final URL url = this.getClass().getClassLoader().getResource("META-INF/parent.xsd"); 
final Schema schema = sf.newSchema(url); 

parent.xsd已包含「kid.xsd」 - 兩個XSD文件都位於同一目錄下