2010-08-03 74 views
0

我一直試圖解析一個(實際上很多)xsd文件來寫出元素名稱列表,各自的元素類型和文檔。我看着XSOM,SAXParser,Xerces,JAXP--所有這些都可以很容易地讀取xml和讀取節點。讀取xsd而不等同於元素名稱(以獲取所有元素名稱的列表)似乎很困難。 parser.parse可以正常工作,因爲我試過的大部分庫(因爲XSD是格式良好的xml),但我無法超越(抽取所有元素名稱)。解析XSD以列出元素

我錯過了什麼?任何人都有類似問題的經驗嗎?

下面是一個示例的xsd:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://abc.mycompany.com/dto/address" targetNamespace="http://abc.mycompany.com/sdo/address"> 
    <xs:complexType name="Address"> 
    <xs:sequence> 
     <xs:element name="address1" minOccurs="0"> 
     <xs:annotation> 
      <xs:documentation>USPS standardized address: building number, street name, apartment/suite number, and directionals (e.g., NE, SE, NW, SW).</xs:documentation> 
     </xs:annotation> 
     <xs:simpleType> 
      <xs:restriction base="xs:normalizedString"> 
      <xs:maxLength value="100" /> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element name="address2" minOccurs="0"> 
     <xs:annotation> 
      <xs:documentation>Additional field for wrapping long addresses.</xs:documentation> 
     </xs:annotation> 
     <xs:simpleType> 
      <xs:restriction base="xs:normalizedString"> 
      <xs:maxLength value="100" /> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element name="city" minOccurs="0"> 
     <xs:annotation> 
      <xs:documentation>Name of the city, town or village.</xs:documentation> 
     </xs:annotation> 
     <xs:simpleType> 
      <xs:restriction base="xs:normalizedString"> 
      <xs:maxLength value="26" /> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element name="state" type="xs:normalizedString" minOccurs="0" > 
     <xs:annotation> 
      <xs:documentation>A pick list of two-letter abbreviations representing US states, 
           military post offices, US protectorates, and Canadian provinces. 
     </xs:documentation> 
     </xs:annotation> 
     </xs:element> 
     <xs:element name="zipCode" type="xs:normalizedString" minOccurs="0" > 
     <xs:annotation> 
      <xs:documentation>The first 5 digits of a 9-digit (Zip+4) zip code, 
        used to geographically locate a US address.</xs:documentation> 
     </xs:annotation> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

回答

1

這得是已配置應對命名空間的解析器。

您也可以使用XSL-T在「xs:element」上匹配並以這種方式提取名稱。

+0

+1絕對要用XSLT。一個簡單的樣式表可以很快解決這個問題,而無需額外的工作。然而,OP的問題有點不足 - 例如,指定如何顯示「各個元素類型」以及如何在複雜類型中嵌套元素的複雜性相當複雜。 – 2010-08-04 02:17:16