我正在尝试使用他们发送的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验证,所以也许我错过了什么?
非常感谢任何帮助。非常感谢!
答案 0 :(得分:0)
格式良好的XML与有效的XML之间存在差异。您的示例格式正确,但无效。如果您定义了架构,则有效性会出现。
阅读以下两篇文章
答案 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.
-->
在这种情况下,Parent
和Child
元素都属于“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”架构进行验证。
对于你的例子,我想这就是你要求的。来自specs:
Prefix提供限定名称的名称空间前缀部分, MUST 与名称空间声明中的名称空间URI引用相关联。
所以是的,你必须绑定它们。