Строгое содержание процесса против слабого против пропуска для xsd: любое

master.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.gworks.cn/waf_profile"
    xmlns:tns="http://www.gworks.cn/waf_profile" elementFormDefault="qualified">
    <element name="profile">
        <complexType>
            <sequence>
                <element name="aspect">
                    <complexType>
                        <sequence minOccurs="1" >
                            <any processContents="strict" />
                        </sequence>
                        <attribute name="id" type="string" use="required"></attribute>
                        <attribute name="class" type="string" use="required"></attribute>
                        <attribute name="desc" type="string" use="optional"></attribute>
                    </complexType>
                </element>
            </sequence>
            <attribute name="name" type="string" use="required"></attribute>
        </complexType>
    </element>
</schema>

Могу ли я написать XML-файл для этой схемы, например:

<?xml version="1.0" encoding="UTF-8"?>
<profile name="开发" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.gworks.cn/waf_profile"
    xsi:schemaLocation="http://www.gworks.cn/waf_profile http://www.gworks.cn/waf_profile.xsd">
    <aspect id="security" class="cn.gworks.waf.config.SecurityConfig" desc="安全配置">
        <security xsi:schemaLocation="http://www.gworks.cn/config_security http://www.gworks.cn/config_security.xsd">
            <authService impl="com.bgzchina.ccms.security.SSOAuthService" enabled="true">
                <certificate>
                    <field name="Token" isKey="true" />
                </certificate>
            </authService>
            <authService impl="com.bgzchina.ccms.security.NoAuthService" enabled="true">
                <certificate>
                    <field name="username" isKey="true" />
                </certificate>
            </authService>
        </security>
    </aspect>
</profile>

где дочерний элемент "безопасность" имеет свою собственную определенную схему.

1 ответ

Решение

Потому что XSD указывает

<any processContents="strict" />

в содержательной модели aspect, ваш XML недействителен из-за processContents="strict", что требует, чтобы процессор XML должен был иметь возможность получить определение XSD для, в данном случае, security и должен быть в состоянии подтвердить это.

Если вы измените это на

<any processContents="lax" />

ваш XML будет действителен, и если вы придете, чтобы определить security в вашем XSD определение будет использоваться во время проверки. (Если определение не может быть найдено, ваш документ все равно будет считаться действительным.) Для этого требуется, чтобы содержимое было действительным только в том случае, если процессор XML может найти его определение.

Если вы измените это на

<any processContents="skip" />

ваш XML будет действительным, а процессор XML не будет пытаться проверять дочерний контент в aspect (кроме того, что требуется, чтобы это был какой-то один элемент в sequence ограничение).

Заметки:

Другие вопросы по тегам