2014-12-11 2 views
7

master.xsd:processContents строгого против Лакса против пропуска для 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> 

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

ответ

9

Поскольку XSD определяет

<any processContents="strict" /> 

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

Если изменить это

<any processContents="lax" /> 

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

Если изменить это

<any processContents="skip" /> 

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

Примечания:

+0

Действительно ли это указать атрибут xsi: schemaLocation в моем элементе «security»? – CaiNiaoCoder

+0

Нет, вы бы принесли XSD, содержащий декларацию 'security', в ваш мастер XSD через атрибут xsi: schemaLocation' на' xsd: import' или 'xsd: include', как я упоминал в ответе. – kjhughes

+0

Но я хочу дать пользователю указать схему для произвольного элемента. – CaiNiaoCoder

Смежные вопросы