【发布时间】:2017-04-18 09:22:08
【问题描述】:
我有一个要针对 xsd(具有多个模式)进行验证的 xml。 xml如下:
<?xml version="1.0" encoding="utf-8"?>
<Interchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abc.com.au/eApplications/Interchange/4.2">
<InterchangeID>19768</InterchangeID>......</Interchange>
此 xml 未通过验证并给我以下错误:
The 'http://www.abc.com.au/eApplications/Interchange/4.2:Interchange' element is not declared.
当我像这样用 xml 引入命名空间时:
xmlns:ns="http://www.abc.com.au/eApplications/Interchange/4.2"
错误消失了,即使我没有引入命名空间前缀或任何 xml 标签,如:
<ns:Interchange>
<ns:InterchangeID>...
我的发现: 如果我将 :ns 作为命名空间引入或完全删除包含定义的所有命名空间引用的行(在父 Interchange 标记之后)并保持这样,则 xml 通过验证:
<Interchange>
<InterchangeId>....
这显然不好。
虽然我能够通过上面解释的方法解决这个问题,但我想知道这背后的原因,因为我在浏览了许多链接后找不到它this、A Ten-Minute Guide to XML Namespaces和XML Namespaces Explained
编辑 我在此处附上 xsd:
enter code here
<xs:schema xmlns:eapp="http://www.abc.com.au/eApps/iChange/4.2"
elementFormDefault="qualified"
targetNamespace="http://www.abc.com.au/eApps/iChange/4.2"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="abc_datatypes.xsd"/>
<xs:complexType name="abcType">
<xs:sequence> </xs:sequence>
</xs:complexType>
</xs:schema>
and the xml sample that passes validation is something like:
<soapenv:Envelope xmlns:soapenv="url"
xmlns:orig="url/OServices" xmlns:ns="http://url/eApps/IChange/4.2">
<soapenv:Header/>
<soapenv:Body>
<or:Originate>
<!--Optional:-->
<or:data>
<ns:InID>2229</ns:InID>
<ns:ReceiverID>CFS</ns:ReceiverID>
</or:data>
</or:Originate>
</soapenv:Body>
</soapenv:Envelope>
【问题讨论】:
-
Interchange元素的 XSD 定义是什么? -
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example。
-
当您删除命名空间前缀时,根节点会变成一个完全未知的节点——未知节点会被视为警告,而不是错误。见XDocument.Validate is always successful。一般来说,任何全局定义的元素都可以是根元素,请参阅XML Schema: root element,这可能就是为什么这是警告而不是错误的原因。
-
这是一个错误,而不是警告