没有名称空间前缀

时间:2017-04-13 00:35:56

标签: c# xml xsd

我有一个xml,我想针对xsd(具有多个模式)进行验证。 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 作为命名空间引入或者完全删除包含所有定义的命名空间引用的行(在父交换标记之后)并保持这样,那么xml会通过验证:

<Interchange>
  <InterchangeId>....

这显然不太好。

虽然我能够通过上述方法解决这个问题,但我想知道这背后的原因,因为我在浏览了很多链接thisA Ten-Minute Guide to XML Namespaces和{{后找不到它3}}

修改 我在这里附上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>

1 个答案:

答案 0 :(得分:0)

TL;博士

  

我的调查结果如果我要么将ns作为命名空间引入或者完全删除该行,则xml会通过验证(在父项之后)   交换标记)包含定义的所有命名空间引用和   保持这样:

<Interchange>
  <InterchangeId>....
     

这显然不太好。

它通过验证,因为两个方法都删除了默认命名空间。

补充说明......

  

这个xml没有通过验证,并给了我以下内容   错误:

     
The 'http://www.abc.com.au/eApplications/Interchange/4.2:Interchange' element is not declared.

您没有提供架构,因此我们无法验证,但这说明``命名空间中的Interchange元素在架构中不存在。

当您声明没有前缀(xmlns="some uri")的命名空间时,该命名空间将成为该上下文的默认命名空间。

由于您说完全删除xmlns="http://www.abc.com.au/eApplications/Interchange/4.2"后没有任何验证错误,这使我相信Interchange不在架构中的命名空间中。

  

当我用xml引入名称空间时:

xmlns:ns="http://www.abc.com.au/eApplications/Interchange/4.2"
     

错误消失了......

那是因为您将命名空间uri http://www.abc.com.au/eApplications/Interchange/4.2绑定到前缀ns,现在没有默认命名空间。