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,它看起来像这样:添加另一个答案,以清理混乱的线程并允许对话继续而不引起混乱......
您的 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 文件中的命名空间的主要内容,如果未能解决你的问题,请参考以下文章