2014-02-12 117 views
0

我正在嘗試通過我已經提供的xsd文件進行迭代。通過xsd xml文件迭代

它有數以百計的這些複雜類型的元素,我試圖遍歷每個元素,最終得到如下所示的數組。

<xs:complexType name="UserAccessDeviceFileGetListRequest"> 
<xs:complexContent> 
    <xs:extension base="core:OCIRequest"> 
    <xs:sequence> 
     <xs:element name="userId" type="UserId"/> 
     <xs:element name="accessDevice" type="AccessDevice"/> 
    </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 

<xs:complexType name="UserAccessDeviceFileModifyRequest"> 
<xs:complexContent> 
    <xs:extension base="core:OCIRequest"> 
    <xs:sequence> 
     <xs:element name="userId" type="UserId"/> 
     <xs:element name="accessDevice" type="AccessDevice"/> 
     <xs:element name="fileFormat" type="DeviceManagementFileFormat"/> 
     <xs:element name="uploadFile" type="FileResource"/> 
    </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 

Array 
(
    [UserAccessDeviceFileGetListRequest] => Array 
               ([0] => "userId" 
               [1] => "accessDevice" 
              ) 
    [UserAccessDeviceFileModifyRequest] = > Array 
               ([0] => "userId" 
               [1] => "accessDevice" 
               [2] => "fileFormat" 
               [3] => "uploadFile" 
              ) 
    ) 

我一直在使用的XMLReader試過,我可以得到複雜類型的名稱,但不能得到任何更深獲取該元素的名稱...

$xsdstring = "file.xsd"; 
$t = new XMLREADER(); 
$t->open($xsdstring); 

while($t->read()) 
{ 
    if ($t->name === "xs:complexType") 
      { 
        echo "-->" . $t->getAttribute('name') . "\n"; 
      } 
} 

結果與所有complexType名稱屬性的列表...

-->UserAccessDeviceFileGetListRequest 
-->UserAccessDeviceFileModifyRequest 

我怎樣才能讓孩子們呢?

+0

在您的代碼片段中,您只能讀取xs:complexType並訪問name屬性。您還需要獲取xs:sequence子元素。 – SenseException

回答

1

您可能會發現使用編譯模式的表示更容易,例如Saxon的SCM格式(這是一個XML詞彙表,但比原始XSD更容易處理,因爲它是單個文件,所有默認值都是擴大等)。

做一個從SCM文件到所需輸出的XSLT轉換將非常簡單。

通過使用低級過程編碼,而不是像XSLT或XQuery這樣的語言,使自己的生活變得更加困難。

+0

撒克遜的東西看起來是基於java的,我沒有做的是在java中。這對我來說是一個全新的世界,所以你說了一些我的頭腦,但我會閱讀這些東西。我欣賞方向。 – bart2puck

+0

您可以使用簡單的命令行調用來生成SCM文件,並且可以使用XSLT轉換生成的文件,因此您實際上不需要編寫任何Java,但您確實需要安裝Java。 –