使用PHP将XML模式默认值注入文档
这里我们有一个简单的XML模式:使用PHP将XML模式默认值注入文档,php,xml,xsd,default-value,Php,Xml,Xsd,Default Value,这里我们有一个简单的XML模式: <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="item"> <xs:complexType> <xs:sequence> <xs:element ref="item"
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="is-foo" type="xs:boolean" default="true" use="optional" />
<xs:attribute name="is-bar" type="xs:boolean" default="false" use="optional" />
</xs:complexType>
</xs:element>
</xs:schema>
我反对的是:
$document = new DOMDocument();
$document->load('./test.xml');
var_dump($document->schemaValidate('./test.xsd'));
$xpath = new DOMXPath($document);
foreach ($xpath->query('//item') as $item) {
echo $item->getNodePath() . PHP_EOL
. ' is-foo : ' . $item->getAttribute('is-foo') . PHP_EOL
. ' is-bar : ' . $item->getAttribute('is-bar') . PHP_EOL;
}
我得到了以下输出(虽然这是意料之中的,但很不幸):
这里的问题是所有的空属性值
除了通过编程将默认值注入到文档中(这需要解释模式以实现任何可重用性)之外,是否有任何选项可以将XML文档转换为包含相应模式中定义的默认值?这在DOM扩展中目前是不可能的 libxml不会这样做,除非在当前使用的模式验证上下文中设置了 我已经创建了一个新的
LIBXML\u SCHEMA\u CREATE
constant(),希望通过schemaValidate()
/schemaValidateSource()
的附加$flags
参数来公开此功能,但我还没有测试它,因为我没有现成的可用构建环境
编辑
补丁现在已经过测试,我已经创建了一个合并到5.5分支中的补丁
编辑2
PR现在已经合并到master中,该功能应该可以从PHP5.5.2中获得
编辑3
补丁上的酷豆:)@Bracketworks完整性:从5.5.2开始,这一功能现在在5.5分支的通用版本中提供。
$document = new DOMDocument();
$document->load('./test.xml');
var_dump($document->schemaValidate('./test.xsd'));
$xpath = new DOMXPath($document);
foreach ($xpath->query('//item') as $item) {
echo $item->getNodePath() . PHP_EOL
. ' is-foo : ' . $item->getAttribute('is-foo') . PHP_EOL
. ' is-bar : ' . $item->getAttribute('is-bar') . PHP_EOL;
}
bool(true)
/item
is-foo : false
is-bar : false
/item/item
is-foo :
is-bar : true
/item/item/item[1]
is-foo :
is-bar :
/item/item/item[1]/item
is-foo : true
is-bar :
/item/item/item[1]/item/item[1]
is-foo :
is-bar :
/item/item/item[1]/item/item[2]
is-foo : true
is-bar :
/item/item/item[2]
is-foo : true
is-bar : true