我有一个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”,“address”,“city”,“country”属于字符串类型。
我想要做的只是打印出“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
答案 0 :(得分:5)
这个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>\n";
$elementDefs = $xpath->evaluate("xs:complexType/xs:sequence/xs:element", $elementDef);
foreach($elementDefs as $elementDef) {
echoElements($indent . " ", $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
定义及其后代元素所示。