【问题标题】:xml not being validated without namespace prefixxml 在没有命名空间前缀的情况下不会被验证
【发布时间】: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>....

这显然不好。

虽然我能够通过上面解释的方法解决这个问题,但我想知道这背后的原因,因为我在浏览了许多链接后找不到它thisA Ten-Minute Guide to XML NamespacesXML 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,这可能就是为什么这是警告而不是错误的原因。
  • 这是一个错误,而不是警告

标签: c# xml xsd


【解决方案1】:

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,而现在没有默认命名空间。

【讨论】:

  • 我确定我构建了正确的 xml,但我可能会因为传递错误的启动标签(如“Interchange”)而感到困惑,因为这是使用提供的 .cs 自动生成的与 xsd。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2022-08-10
  • 1970-01-01
相关资源
最近更新 更多