Строгое содержание процесса против слабого против пропуска для 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
ограничение).
Заметки:
- Значение по умолчанию для
processContents
являетсяstrict
, - См. Раздел 3.10.2 XML-представление компонентов схемы с подстановочными знаками в Рекомендации XSD для получения дополнительной информации.
- Если вам интересно, как добавить еще один XSD в ваш основной XSD, см. Xsd: import vs xsd:include.