1

我正在尝试使用他们发送的模式来验证客户端 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 在 XMLSpy 和 VisualStudio 中验证,所以也许我遗漏了什么?

任何帮助将不胜感激。非常感谢!

4

2 回答 2

0

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

元素总是绑定到一个“命名空间名称”。如果没有为命名空间提供 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>

在这种情况下,两者都Parent属于Child“无值”命名空间,因此它们将根据“no-targetNamespaced”模式进行验证。

是否有必要将前缀绑定到命名空间?

对于您的示例,我想这就是您所要求的。从规格

Prefix 提供了限定名称的命名空间前缀部分,并且必须与命名空间声明中的命名空间 URI 引用相关联。

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

于 2014-07-17T07:40:18.003 回答
0

格式良好的 XML 和有效的 XML 之间是有区别的。您的示例格式正确,但无效。如果您定义了模式,那么有效性就会出现。

阅读以下两篇文章

  1. http://dli.grainger.uiuc.edu/publications/xmltutorial/xml/tsld005.htm
  2. 在文档中引用 XSD 架构
于 2013-04-29T13:38:52.503 回答