2010-10-13 60 views
0

我試圖把一些驗證代碼放在一起。我試圖驗證對像模式:對複雜類型的javax.xml.parsers.DocumentBuilder支持

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:choice="http://example.com/SimpleChoice" targetNamespace="http://example.com/SimpleChoice" ecore:nsPrefix="choice" ecore:package="com.example.simple.choice"> 
    <xsd:complexType name="Plane"> 
     <xsd:sequence> 
      <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/> 
      <xsd:element name="passengers" type="xsd:int" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

用下面的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<choice:Plane xmlns:choice="http://example.com/SimpleChoice"> 
    <freightDetails>Boxes</freightDetails> 
</choice:Plane> 

這似乎抱怨是沒有的元素,但我試圖找到一種方法來驗證反對類型。我收到以下錯誤:

[Error] :1:100: cvc-elt.1: Cannot find the declaration of element 'choice:Plane'. 

當試圖將文件用下面的代碼加載:

SchemaFactory factory = 
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(schemaFile); 

DocumentBuilderFactory parserFactory = DocumentBuilderFactory.newInstance(); 
parserFactory.setSchema(schema); 
parserFactory.setNamespaceAware(true); 
DocumentBuilder parser = parserFactory.newDocumentBuilder(); 

Document document = parser.parse(inputSource); 

Validator validator = schema.newValidator(); 
validator.validate(new DOMSource(document)); 

它時,它得到的失敗:

Document document = parser.parse(inputSource); 

沒有人有關於如何才能做到這一點的任何想法? (或支持這種行爲的驗證?)

感謝

羅布

回答

1

這是因爲您的架構已定義類型(Plane),但尚未定義任何允許的元素使用該類型。一個類型本身在模式本身之外沒有意義。

您需要將<xsd:element>添加到您的模式。最簡單的解決方法是使用範圍內的匿名複雜類型,像這樣:

<xsd:element name="Plane"> 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/> 
     <xsd:element name="passengers" type="xsd:int" minOccurs="0"/> 
    </xsd:sequence> 
    </xsd:complexType>  
</xsd:element> 
+0

感謝您的建議,我曾嘗試以前有元素的情況下,他們確實工作。然而,我有一個情況,我想驗證這種類型,並希望有一種方式支持。 – Rob 2010-10-13 14:31:42

+0

@RobL:不,這不是XML Schema的工作原理。您針對元素進行驗證,而不是類型。 – skaffman 2010-10-13 14:34:01

0

在你的榜樣模式,你只定義了一個命名爲Plane,而不是一個元素命名Plane。添加元素聲明到您的模式,看看會發生什麼...

+0

感謝您的建議,我也嘗試在那裏以前有一個元素的情況下,他們確實工作。然而,我有一個情況,我想驗證這種類型,並希望有這種方式支持 – Rob 2010-10-13 14:32:15