Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP将XML模式默认值注入文档_Php_Xml_Xsd_Default Value - Fatal编程技术网

使用PHP将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"

这里我们有一个简单的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" 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