xsd验证同时抱怨缺少属性和错误属性

时间:2015-05-15 19:33:30

标签: xml schema xsd-validation

我从xsd验证中得到一些精神分裂的行为。这个link显示了在线模式验证器中的xml和xsd +错误。当我在本地使用xmllint

运行时
xmllint --noout --nonet --schema devhelp2.xsd tester.devhelp2

我收到类似的警告:

tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub', attribute 'name': The attribute 'name' is not allowed.
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub', attribute 'link': The attribute 'link' is not allowed.
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub': The attribute '{urn:devhelp}name' is required but missing.
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub': The attribute '{urn:devhelp}link' is required but missing.

但是这暗示了命名空间有问题。

PS:

我可以通过完全删除xmlns来进行验证(取自zvon.org)。请参阅here for the new online validator example - 我仍然想了解它,是不是有保留xmlns的解决方案?

1 个答案:

答案 0 :(得分:4)

简化示例

我将您的示例缩减为以下XML架构。

GoogleCredential credentials = new GoogleCredential.Builder()
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
    .setJsonFactory(jsonFactory).setTransport(transport).build()
    .setRefreshToken("<REFRESH_TOKEN>").setAccessToken("<ACCESS_TOKEN>");

和这个XML

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:devhelp"
  xmlns="urn:devhelp"
  elementFormDefault="qualified">

  <xsd:attribute name="title" type="xsd:string"/>

  <xsd:element name="book">
    <xsd:complexType>
      <xsd:attribute ref="title" use="required"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

验证错误

  

无效。
  错误 - 第2,60行:org.xml.sax.SAXParseException; lineNumber:2; columnNumber:60; cvc-complex-type.3.2.2:属性'title'不允许出现在元素'book'中   错误 - 第2,60行:org.xml.sax.SAXParseException; lineNumber:2; columnNumber:60; cvc-complex-type.4:属性'title'必须出现在元素'book'上。

矛盾的验证错误很好地表明命名空间出了问题。

规范:XML 1.0中的命名空间

规范说明

  

6.2 Namespace Defaulting

     

...默认名称空间声明不直接应用于属性   名称;对无前缀属性的解释由   它们出现的元素。

第一个子句解释了属性不会继承元素的默认命名空间声明。因此<?xml version="1.0" encoding="utf-8" standalone="no"?> <book xmlns="urn:devhelp" title="tester Reference Manual"/> 没有名称空间,而您的XML模式需要名称空间/book/@title的{​​{1}}属性。

第二个条款很棘手,因为很容易误解。它只是说属性不需要命名空间,因为它们可以根据周围的元素使用不同。

一个例子也提到了这种行为:

  

6.3 Uniqueness of Attributes

     

...但是,以下各项都是合法的,第二种是因为默认命名空间不适用于属性名称:
  ...
  &lt; x xmlns:n1 =“http://www.w3.org”xmlns =“http://www.w3.org”&gt;

  &lt; good a =“1”b =“2”/&gt;
  &lt; good a =“1”n1:a =“2”/&gt;
  &LT; / X&GT;

<强>解决方案

明确设置属性的命名空间。

title

或避免urn:devhelp之外的属性定义:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<book xmlns="urn:devhelp" xmlns:mine="urn:devhelp" mine:title="tester Reference Manual"/>