【问题标题】:Determine XML schemas and namespaces from schemas从模式中确定 XML 模式和命名空间
【发布时间】:2014-03-03 11:11:13
【问题描述】:

是否可以根据用于定义 XML 中使用的元素的架构来确定应在某些 XML 中指定哪些命名空间和架构?

鉴于这些架构:

需要哪些附加信息(如果有)来确定以下 XML 摘录中提到的命名空间和架构 source

<?xml version="1.0" encoding="UTF-8"?>
<GovTalkMessage xsi:schemaLocation="http://www.govtalk.gov.uk/schemas/govtalk/govtalkheader http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch.xsd"
    xmlns="http://www.govtalk.gov.uk/schemas/govtalk/govtalkheader"
    xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
    xmlns:gt="http://www.govtalk.gov.uk/schemas/govtalk/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <EnvelopeVersion>1.0</EnvelopeVersion>
  <Header>
      [removed for brevity]
  </Header>
  <GovTalkDetails>
    <Keys />
  </GovTalkDetails>
  <Body>
    <NameSearchRequest xmlns="http://xmlgw.companieshouse.gov.uk/v1-0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema/NameSearch.xsd" >
        [removed for brevity]
    </NameSearchRequest>
  </Body>
</GovTalkMessage>


在GovTalkMessage 元素中,我了解xsi:schemaLocation 的第二部分来自哪里,但我不确定是否可以从架构本身确定第一部分。

我不明白xmlns 值来自GovTalkMessage 或NameSearchRequest 中的哪一个。它是在某个地方定义的吗?

xmlns:dsig、xmlns:gt 在GovTalkMessage 架构中被提及,xmlns:hd 也是如此,我如何区分上面的 XML 中哪些需要提及,哪些不需要?

为什么NameSearchRequest 的xsi:schemaLocation 只有一个值?我认为该属性需要两个值,以空格分隔。

【问题讨论】:

    标签: xml xsd xml-namespaces


    【解决方案1】:

    请看下面我的回答。

    在 GovTalkMessage 元素中,我了解第二部分的位置 xsi:schemaLocation 来自,但不确定是否可行 从架构本身确定第一部分。

    xsi:schemaLocation 的第一部分告诉模式所在的命名空间与哪个命名空间相关联。基本上,您将命名空间 http://www.govtalk.gov.uk/schemas/govtalk/govtalkheader 用于位于 http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch.xsd 的架构(对于 xsi:schemaLocation 中使用的任何架构,它始终是该架构的目标命名空间(请参阅 targetNamespace 属性),然后是位置)

    我不明白 xmlns 值是从哪里来的 GovTalkMessage 或 NameSearchRequest。它是在某个地方定义的吗?

    xmlns 是默认命名空间。如果元素没有使用前缀限定,则它们属于默认命名空间。在这种情况下,元素 GovTalkMessage 和 NameSearchRequest 属于由各自架构中的 xmlns 属性引用的默认命名空间。

    xmlns:dsig, xmlns:gt 在 GovTalkMessage 架构中被提及,但是 xmlns:hd 也是如此,我如何判断需要在 XML 中提及哪个 上面哪些不是?

    如果您想在 XML 中使用由这些命名空间(xmlns:dsig、xmlns:gt、xmlns:hd、...)定义的元素或属性,您将声明这些命名空间。这就像在 Java 中声明对象引用并在稍后的程序中使用这些对象引用的属性。

    为什么 NameSearchRequest 的 xsi:schemaLocation 只有一个值?一世 认为该属性需要两个值,以空格分隔。

    如果您注意到架构 http://xmlgw.companieshouse.gov.uk/v1-0/schema/NameSearch.xsd,它没有目标命名空间。这就是在这种情况下您没有命名空间而只有位置的原因。但是,您必须使用xsi:noNamespaceSchemaLocation 而不是xsi:schemaLocation,否则xml 解析器会抛出错误。 xsi:schemaLocation 只接受“命名空间位置”对。

    【讨论】:

    • 1) 我明白xsi:schemaLocation 的第一部分表示什么,但我不明白http://www.govtalk.gov.uk/schemas/govtalk/govtalkheader 的值来自哪里。 2) 两种模式中都没有xmlns 属性,除非我误解了。 3)所以在这种情况下我不需要定义它们? 4) 有道理,谢谢。
    • 1) 如果您看到我的回答,第一部分始终是关联架构的“目标命名空间”。 2)架构和实例文档的xmlns不同!任何 XML Schema 的 xmlns 只能有一个值,即 http://www.w3.org/2001/XMLSchema。实例文档的 xmlns 取决于您使用的架构元素。例如,您正在使用 GovTalkMessage 元素,因此 xmlns 将是此元素架构的目标命名空间。 3) 为简洁起见,您删除了一些 xml 代码。只要不使用这些元素或属性,就不需要声明。
    • @Jon 我的回答有意义吗?让我知道是否必须在任何地方详细说明。
    • 您说If you notice the schema http://xmlgw.companieshouse.gov.uk/v1-0/schema/NameSearch.xsd, which has no target namespace. This is the reason you don't have namespace but just location in this case. 是错误的 - 请更正。如果没有 targetNamespace,则必须使用 xsi:noNamespaceSchemaLocation 属性;否则,在 xsi:schemaLocation 中必须只有对。链接的源 XML 完全错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2013-09-12
    • 2016-05-12
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多