元素'foo':不应使用此元素。预期为({http://www.example.com} foo)

米克尔

当尝试使用schemaValidate方法针对某个架构验证PHP DOMDocument对象时,将生成下一个警告:

警告:DOMDocument :: schemaValidate():元素'foo':不需要该元素。预期为({ http://www.example.com } foo)。在Y行的X中

它仅在附加到DOMDocument的元素上发生。我准备了下一个代码段和架构,以便任何人都可以立即进行测试:

片段:

$template = '
    <root
        xmlns="http://www.example.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.com schema.xsd"
    >
        <bar/>
    </root>
';

$DD = new DOMDocument(); 
$DD -> loadXML($template);
$foo = $DD -> createElement('foo');
$DD -> getElementsByTagName('root') -> item(0) -> appendChild($foo);
var_dump(htmlentities($DD -> saveXML()));
var_dump($DD -> schemaValidate(__DIR__ . '/schema.xsd'));

架构:

<?xml version="1.0"?>
<xs:schema
    targetNamespace="http://www.example.com"
    xmlns:SiiDte="http://www.example.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
>
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar"/>
                <xs:element name="foo"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我没有看到foo和bar之间的区别,除了foo是通过appendChild方法添加的,而bar是通过loadXML方法添加的。

验证返回false(这意味着验证错误)。当使用loadXML方法加载foo时,错误停止发生,但这绝对不是解决方案,因为在很多情况下需要动态创建XML。

¿为什么附加元素会产生此验证错误,如何解决?

哈克雷

<foo>您创建的元素“缺少”名称空间,因此在空名称空间中。

命名空间也是错误消息中大括号(或尖括号)中显示的部分:

  {http://www.example.com}foo
  `----------------------´`-´
           namespace      name

而不是createElement使用createElementNS元素名称旁边的名称空间。

当您将创建的文档另存为XML(例如通过查看对其进行手动验证)时,您完全可以认为该元素看起来<bar>

<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
    <bar/>
<foo/></root>

但是它只是添加了一个空的namspace(因此插入时没有太多的名称空间),并且在内存中该元素仍然没有名称空间-并且验证在内存中。

这是一个实际的验证示例:

<?php
/**
 * Element 'foo': This element is not expected. Expected is ( {http://www.example.com}foo )
 *
 * @link http://stackoverflow.com/a/29925747/367456
 */

$template = <<<XML
<root
    xmlns="http://www.example.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.com schema.xsd">
    <bar/>
</root>
XML;

$schema = <<<XML
<?xml version="1.0"?>
<xs:schema
    targetNamespace="http://www.example.com"
    xmlns:SiiDte="http://www.example.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar"/>
                <xs:element name="foo"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
XML;
$schema = 'data://text/xml;base64,' . base64_encode($schema);

$namespace = 'http://www.example.com';

$doc = new DOMDocument();
$doc->loadXML($template);
$foo = $doc->createElementNS($namespace, 'foo');
$doc->documentElement->appendChild($foo);
echo $doc->saveXML();

var_dump($doc->schemaValidate($schema));

输出为:

<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
    <bar/>
<foo/></root>
bool(true)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

<a>标记中的http://foo.com与//foo.com?

来自分类Dev

意外元素(uri:“ http://www.w3schools.com”,本地:“武器”)。预期元素为<{}武器>

来自分类Dev

使用哪个:foo和foo:

来自分类Dev

意外元素(uri:“ http://www.w3schools.com”,本地:“武器”)。预期的元素是<{}武器>

来自分类Dev

Nginx将子域foo重定向到www.foo到www.www.foo等

来自分类Dev

http://example.com、http://www.example.com和https://example.com到https://www.example.com

来自分类Dev

foo.example.com可以为bar.example.com设置cookie吗?

来自分类Dev

Python Spyne-SOAP服务器-不应使用此元素。预期为({http://} Element_name)

来自分类Dev

我如何从'./foo'`将*导出为foo?

来自分类Dev

获取以“ foo”开头的类的元素,并将事件附加到它们

来自分类Dev

PCollectionView<List<Foo>> 的访问元素:Google Cloud Dataflow/Apache Beam

来自分类Dev

如何使用脚本/别名使bash / zsh将某些文本从“ foo.foo.foo”更改为“ foo foo foo”?

来自分类Dev

在bar :: foo`的内部使用`foo`吗?

来自分类Dev

Rxjs。使用http调用映射每个对象Observable <Foo []>

来自分类Dev

我想将 example.com/chapter-foo.php 重定向到 example.com/chapter.php

来自分类Dev

预期的struct foo *,但函数指针的参数类型为struct foo *

来自分类Dev

将http://www.example.com重定向到http://example.com

来自分类Dev

使用本地`foo = require“ foo”`比使用`foo = require“ foo”`更快吗?

来自分类Dev

错误:未注册外部资源http://www.example.com/

来自分类Dev

错误:未注册外部资源http://www.example.com/

来自分类Dev

告诉打字稿,Object.keys(foo)的每个元素实际上是foo的键的最干净方法是什么?

来自分类Dev

Rust泛型/特征:“预期为'Foo <B>',找到的为'Foo <Foo2>'”

来自分类Dev

yum install http://www.example.com/package.rpm与rpm -ivh http://www.example.com/package.rpm

来自分类Dev

Web.config重定向到http://www.example.com到https://example.com

来自分类Dev

将 url http://example.com 改为 Https://www.example.com

来自分类Dev

获取值设置为foo的页面上的所有Select元素

来自分类Dev

null == foo与foo == null

来自分类Dev

Foo <?,?,?>不是Foo <?,?,?>

来自分类Dev

foo(void)与foo(void *)

Related 相关文章

  1. 1

    <a>标记中的http://foo.com与//foo.com?

  2. 2

    意外元素(uri:“ http://www.w3schools.com”,本地:“武器”)。预期元素为<{}武器>

  3. 3

    使用哪个:foo和foo:

  4. 4

    意外元素(uri:“ http://www.w3schools.com”,本地:“武器”)。预期的元素是<{}武器>

  5. 5

    Nginx将子域foo重定向到www.foo到www.www.foo等

  6. 6

    http://example.com、http://www.example.com和https://example.com到https://www.example.com

  7. 7

    foo.example.com可以为bar.example.com设置cookie吗?

  8. 8

    Python Spyne-SOAP服务器-不应使用此元素。预期为({http://} Element_name)

  9. 9

    我如何从'./foo'`将*导出为foo?

  10. 10

    获取以“ foo”开头的类的元素,并将事件附加到它们

  11. 11

    PCollectionView<List<Foo>> 的访问元素:Google Cloud Dataflow/Apache Beam

  12. 12

    如何使用脚本/别名使bash / zsh将某些文本从“ foo.foo.foo”更改为“ foo foo foo”?

  13. 13

    在bar :: foo`的内部使用`foo`吗?

  14. 14

    Rxjs。使用http调用映射每个对象Observable <Foo []>

  15. 15

    我想将 example.com/chapter-foo.php 重定向到 example.com/chapter.php

  16. 16

    预期的struct foo *,但函数指针的参数类型为struct foo *

  17. 17

    将http://www.example.com重定向到http://example.com

  18. 18

    使用本地`foo = require“ foo”`比使用`foo = require“ foo”`更快吗?

  19. 19

    错误:未注册外部资源http://www.example.com/

  20. 20

    错误:未注册外部资源http://www.example.com/

  21. 21

    告诉打字稿,Object.keys(foo)的每个元素实际上是foo的键的最干净方法是什么?

  22. 22

    Rust泛型/特征:“预期为'Foo <B>',找到的为'Foo <Foo2>'”

  23. 23

    yum install http://www.example.com/package.rpm与rpm -ivh http://www.example.com/package.rpm

  24. 24

    Web.config重定向到http://www.example.com到https://example.com

  25. 25

    将 url http://example.com 改为 Https://www.example.com

  26. 26

    获取值设置为foo的页面上的所有Select元素

  27. 27

    null == foo与foo == null

  28. 28

    Foo <?,?,?>不是Foo <?,?,?>

  29. 29

    foo(void)与foo(void *)

热门标签

归档