2

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

只是<item>具有可选is-foo/is-bar布尔属性的递归节点,默认为truefalse

现在,在 PHP 中读取 XML 数据的上下文中,这些默认值有什么用处?如果我有一个有效的 XML 文档:

<item is-foo="false" is-bar="false">
    <item is-bar="true">
        <item>
            <item is-foo="true">
                <item />
                <item is-foo="true" />
            </item>
        </item>
        <item is-foo="true" is-bar="true" />
    </item>
</item>

我针对它运行:

$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

这里的问题是所有空属性值。

除了以编程方式将默认值注入文档(这将需要解释架构以实现任何可重用性)之外,是否有任何选项可以将 XML 文档转换为包含相应架构中定义的默认值?

4

1 回答 1

4

DOM 扩展目前无法做到这一点。

libxml 不会这样做,除非XML_SCHEMA_VAL_VC_I_CREATE在使用的模式验证上下文中设置了 ,而目前它不是.

我创建了一个补丁,希望通过/的附加$flags参数和新常量(示例目标代码)来公开此功能,但我尚未对其进行测试,因为我没有现成可用的构建环境.schemaValidate()schemaValidateSource()LIBXML_SCHEMA_CREATE

编辑

该补丁现在已经过测试,我创建了一个PR以合并到 5.5 分支中。

编辑 2

PR 现在已合并到 master 中,该功能应该可以从 PHP 5.5.2 获得。

编辑 3

看到它工作

于 2013-04-11T16:54:03.333 回答