RAML 文件中的命名空间

Posted

技术标签:

【中文标题】RAML 文件中的命名空间【英文标题】:Namespace in RAML file 【发布时间】:2020-03-30 09:30:16 【问题描述】:

我在尝试创建 RAML unsing 库来定义 XML 类型时遇到了一些问题。看起来正在将前缀传播到所有属性。

图书馆是这样的:

#%RAML 1.0 Library

types:  
  book:
    type: object
    properties:
      id:
        type: integer
      title:
        type: string
      author: 
        type: string
    xml:
      prefix: 'smp'
      namespace: 'http://example.com/schema'
      name: 'book'

RAML 是这样的:

#%RAML 1.0

title: book test

uses:
  myLib: /libraries/types.raml

/book:
  description: book
  post:    
    body: 
      application/xml:
        type: myLib.book

这是为 API 发送的 XML:

<?xml version="1.0" encoding="utf-8"?>
<smp:book xmlns:smp="http://example.com/schema">
    <id>0</id>
    <title>string</title>
    <author>string</author>
</smp:book>

我收到了这个错误:


    "code": "REQUEST_VALIDATION_ERROR",
    "message": "Invalid schema for content type application/xml. Errors: cvc-complex-type.2.4.b: The content of element 'smp:book' is not complete. One of '\"http://example.com/schema\":id, \"http://example.com/schema\":title, \"http://example.com/schema\":author' is expected.. "

【问题讨论】:

您还在为此苦苦挣扎吗?如果是这样,我可能会提供帮助 是的,这个问题仍然存在。 【参考方案1】:

我想我知道这里发生了什么。在您的 XML 文档中,根标记“book”位于命名空间“http://example.com/schema”中。 'book' 的子标签 not 用命名空间限定。我自己没有尝试过,但我怀疑 RAML 会自动将“book”的命名空间传播到它的属性上。但是,RAML 规范确实允许在属性和类型上使用 xml 节点:XML Serialization of Type instances 所以你可以修改你对“书”的定义如下:

#%RAML 1.0 Library

types:  
  book:
    type: object
    xml:
      prefix: 'smp'
      namespace: 'http://example.com/schema'
      name: 'book'
    properties:
      id:
        type: integer
        xml:
          namespace: ''
      title:
        type: string
        xml:
          namespace: ''
      author: 
        type: string
        xml:
          namespace: ''

如果这不起作用,您可以将“book”类型的整个定义替换为(手动创建的)文件“book.xsd”。确保 xs:schema 标记上的“elementFormDefault”属性设置为“不合格”。然后从 RAML 中引用 book.xsd。

即使尝试使用 XSD 我也会收到错误:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="id" type="xs:byte"/>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="author" type="xs:string"/>
</xs:schema>

错误:


    "code": "REQUEST_VALIDATION_ERROR",
    "message": "Invalid schema for content type application/xml. Errors: cvc-elt.1.a: Cannot find the declaration of element 'smp:book'.. "

【讨论】:

它没有用,我试图创建 XSD,它看起来像这样: w3.org/2001/XMLSchema"> 但我收到此错误 "code": "REQUEST_VALIDATION_ERROR", "message": "Invalid schema for content type application/xml. Errors: cvc-elt.1.a: 找不到元素'smp:book'的声明.." 我可以看到问题所在。请编辑问题并在那里发布 xsd(在评论中不可读) 我看到在我之前为 XSD 过去的示例中它是合格的,我更改并继续收到问题中的错误 我已经批准了你的编辑——不是因为我不同意审稿人,而是为了继续前进并尝试解决这个问题。【参考方案2】:

添加另一个答案,以清理混乱的线程并允许对话继续而不引起混乱......

您的 xsd 有两个绝对巨大的缺陷。

您尚未声明全局元素“book”。错误信息很清楚,所以你错过了。 您尚未为此 XSD 中的全局元素声明目标命名空间

我在下面更改了您的 XSD,它比您发布的那个更有可能工作。请试一试。

<schema 
    attributeFormDefault="unqualified" 
    elementFormDefault="unqualified" 
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://example.com/schema"
>

  <element name="book">
    <complexType>
      <sequence>
        <element name="id" type="byte"/>
        <element name="title" type="string"/>
        <element name="author" type="string"/>
      </sequence>
    </complexType>
  </element>
</schema>

【讨论】:

以上是关于RAML 文件中的命名空间的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的命名空间

C# - 在共享命名空间中跨文件使用命名空间

如何使用Xpath检索XML文件中的命名空间

说说PHP中的命名空间相关概念

用于头文件中的匿名命名空间

PHP TP命名空间