XML验证:是否有必要将元素绑定到命名空间?

时间:2013-04-29 13:20:17

标签: xml xsd-validation

我正在尝试使用他们发送的Schema来验证客户端XML。示意性地看起来像这样:

<?xml version="1.0" encoding="UTF-8">
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.client.com"
           targetNamespace="http://www.client.com"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           version="0.1">

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Parent" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="Parent">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Child1" type="xs:string"/>
      <xs:element name="Child2" type="xs:string" nillable="true"/>
      <xs:element name="Child3" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

我想要验证的XML的一个例子是

<Parent>
  <Child1>Entry</Child1>
  <Child2 xsi:nil="true"/>
  <Child3>Entry</Child3>
</Parent>

我的问题是:上面的XML实际上是否格式正确?我对XML的理解很差,我认为'xsi'标签需要一个命名空间,实际上当我们验证这是我们得到的错误时(标签'xsi'没有绑定到任何命名空间)。将XML更改为:

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Child1>Entry</Child1>
  <Child2 xsi:nil="true"/>
  <Child3>Entry</Child3>
</Parent>

解决了我们的问题,对我来说更有意义。然而,客户端说XML XML和VisualStudio中的原始XML验证,所以也许我错过了什么?

非常感谢任何帮助。非常感谢!

2 个答案:

答案 0 :(得分:0)

格式良好的XML与有效的XML之间存在差异。您的示例格式正确,但无效。如果您定义了架构,则有效性会出现。

阅读以下两篇文章

  1. http://dli.grainger.uiuc.edu/publications/xmltutorial/xml/tsld005.htm
  2. Referencing XSD Schemas in Documents

答案 1 :(得分:0)

是否有必要将元素绑定到命名空间?

元素始终绑定到“namespace name”。如果没有为命名空间提供URI,则“命名空间名称”没有值。然后,您可以使用noNamespaceSchemaLocation属性来定义元素类型。

例如,如果您的xml与目标命名空间匹配,则应编写

<Parent xmlns="http://www.client.com" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.client.com client.xsd">
...
</Parent>

<!--
Remarks:
(Line 1) default namespace (when using no prefix) = "http://www.client.com"
(Line 3) provided that `client.xsd` is the correct client schema location.
-->

在这种情况下,ParentChild元素都属于“http://www.client.com”命名空间,验证程序知道它必须验证xml。

如果您的架构没有声明targetNamespace="http://www.client.com",那么要根据您的架构进行验证,您需要编写:

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.client.com client.xsd">
...
</Parent>

在这种情况下,ParentChild都属于“无值”命名空间,因此它们将根据“no-targetNamespaced”架构进行验证。

是否需要将前缀绑定到名称空间?

对于你的例子,我想这就是你要求的。来自specs

  

Prefix提供限定名称的名称空间前缀部分, MUST 与名称空间声明中的名称空间URI引用相关联。

所以是的,你必须绑定它们。