Php 遍历xsd xml文件

Php 遍历xsd xml文件,php,xml,xsd,xmlreader,Php,Xml,Xsd,Xmlreader,我正在尝试遍历一个给定的xsd文件 它有数百个这样的复杂类型元素,我试图遍历每一个元素,最后得到一个数组,如下所示 <xs:complexType name="UserAccessDeviceFileGetListRequest"> <xs:complexContent> <xs:extension base="core:OCIRequest"> <xs:sequence> <xs:element name="use

我正在尝试遍历一个给定的xsd文件

它有数百个这样的复杂类型元素,我试图遍历每一个元素,最后得到一个数组,如下所示

 <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>
我尝试过使用xmlreader,我可以获得complexType的名称,但无法获得更深入的元素名称

  $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

如何获得子项呢?

您可能会发现使用编译模式的表示更容易,例如Saxon的SCM格式(这是一个XML词汇表,但比原始XSD更容易处理,因为它是一个单独的文件,所有默认值都会扩展,等等)

执行从SCM文件到所需输出的XSLT转换非常简单


通过使用低级过程编码而不是XSLT或XQuery之类的语言,您的生活变得更加困难。

在您的代码片段中,您只能读取xs:complexType并访问name属性。你也需要得到xs:sequence子元素,Saxon的东西看起来是基于java的,我现在做的都是java。对我来说,这是一个全新的世界,所以你的话有点超出我的理解,但我会仔细阅读这篇文章。我很欣赏这个方向。您可以通过一个简单的命令行调用生成一个SCM文件,并且可以使用XSLT转换生成的文件,因此您实际上不需要编写任何Java,尽管您确实需要安装Java。
  $xsdstring = "file.xsd";
 $t = new XMLREADER();
 $t->open($xsdstring);

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