gpt4 book ai didi

php - 使用 PHP 将 XML 模式默认值注入(inject)文档

转载 作者:行者123 更新时间:2023-12-04 05:02:40 24 4
gpt4 key购买 nike

这里我们有一个简单的 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 bool 属性,默认为 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

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

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

最佳答案

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

libxml 不会这样做,除非 XML_SCHEMA_VAL_VC_I_CREATE 在使用的模式验证上下文中设置,当前为 it isn't .

我创建了一个 patch希望通过一个额外的 $flags 来公开这个功能。 schemaValidate() 的参数/schemaValidateSource()和一个新的 LIBXML_SCHEMA_CREATE常量(example target code),但我还没有测试它,因为我没有现成的可用构建环境。

编辑

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

编辑 2

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

编辑 3

See it working

关于php - 使用 PHP 将 XML 模式默认值注入(inject)文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com