在PHP中解析XSD文件并在XSD中显示元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PHP中解析XSD文件并在XSD中显示元素相关的知识,希望对你有一定的参考价值。

我有一个XSD架构文件,我想解析它并回显它包含的元素,如果可能的话,也可以显示每个元素都有的子元素。我见过一些例子,其中最好的例子有:Convert XSD file into array in PHP

我尝试了它,即使在xpaths和文件位置中更改了xs:部分之后它也给了我一个空数组。有没有一种正确的方法来解析XSD文件并在php中显示其元素?

为了澄清这里的任何困惑,我想说的是:

让我们说这是我试图加载并显示其元素的XSD(这来自上面的链接):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

正如我们所看到的那样,有一个名为“shiporder”的元素,它有子节点,如果我没有记错,“orderperson”有类型字符串,它还有“shipto”,它有子元素:“name “,”地址“,”城市“,”国家“是字符串类型。

我想要做的只是打印出“shiporder”有孩子“orderperson”和“shipto”“shipto”有孩子“名字”,“地址”,“城市”和“国家”。

我该怎么做呢?我应该使用下面描述的方法吗?:

<?php 
$attributes = array(); 
$xsdstring = "test.xsd"; 
$XSDDOC = new DOMDocument(); 
$XSDDOC->preserveWhiteSpace = false; 
if ($XSDDOC->load($xsdstring)) 
{ 
    $xsdpath = new DOMXPath($XSDDOC); 
    $attributeNodes = 
              $xsdpath-> 
              query('//xs:element[@name="shiporder"]')
              ->item(0); 
    foreach ($attributeNodes->childNodes as $attr) 
    { 
        $attributes[ $attr->getAttribute('value') ] = $attr->getAttribute('name'); 
    } 
    unset($xsdpath); 
} 
print_r($attributes); 
?>

希望这使我的问题更清晰,因为我是php和xml解析的新手。

提前致谢,

-Kevin

答案

这个PHP:

<?php 

$xsdstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="shiporder">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="orderperson" type="xs:string"/>
        <xs:element name="shipto">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string"/>
              <xs:element name="address" type="xs:string"/>
              <xs:element name="city" type="xs:string"/>
              <xs:element name="country" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="item" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="title" type="xs:string"/>
              <xs:element name="note" type="xs:string" minOccurs="0"/>
              <xs:element name="quantity" type="xs:positiveInteger"/>
              <xs:element name="price" type="xs:decimal"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="orderid" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
XML;

$doc = new DOMDocument();
$doc->loadXML(mb_convert_encoding($xsdstring, 'utf-8', mb_detect_encoding($xsdstring)));
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('xs', 'http://www.w3.org/2001/XMLSchema');

function echoElements($indent, $elementDef) {
  global $doc, $xpath;
  echo "<div>" . $indent . $elementDef->getAttribute('name') . "</div>
";
  $elementDefs = $xpath->evaluate("xs:complexType/xs:sequence/xs:element", $elementDef);
  foreach($elementDefs as $elementDef) {
    echoElements($indent . "&nbsp;&nbsp;&nbsp;&nbsp;", $elementDef);
  }
}

$elementDefs = $xpath->evaluate("/xs:schema/xs:element");
foreach($elementDefs as $elementDef) {
  echoElements("", $elementDef);
}                       
?>

产生以下输出:

shiporder
    orderperson
    shipto
        name
        address
        city
        country
    item
        title
        note
        quantity
        price

按照要求。

请注意,这假设使用基本嵌入式Russian Doll XSD design结构的简单xs:complexType/xs:sequence/,如提供的shiporder定义及其后代元素中所示。

以上是关于在PHP中解析XSD文件并在XSD中显示元素的主要内容,如果未能解决你的问题,请参考以下文章

如何定义XSD并在XML中使用XSD

Apache XMLSchema 核心 XSD/XML 解析器将根元素显示为所有子元素的父元素,而不是其直接父元素

如何在 Java DocumentBuilder 中解析 XSD 文件期间将元素附加到现有节点列表

XML, DTD, XSD, SGML

使用 php 针对 xsd 验证 xml 文件

XSD 到 jaxb 注释类给出了无法解析 xml 元素错误