我已经使用Jersey工作了几天的REST Web服务,并设法让所有CRUD操作工作,有几种交换格式:XML,JSON,Google Protobuf.
但是,我面临一些与自动生成的WADL和XSD相关的问题.
为了定义以这三种格式交换的对象,我遵循了"契约优先"的方法:
但是,由于我希望我的用户也能够生成他们的类,我想分享这些模式文件(.xsd和.proto)并将它们与自动生成的WADL很好地集成.
为此,感谢这个维基页面:
/schema/schema.xsd/schema/schema.proto我添加了一个应用程序语法文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammars xmlns="http://wadl.dev.java.net/2009/02"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xi="http://www.w3.org/1999/XML/xinclude">
<include href="../schema/schema.xsd" />
</grammars>
Run Code Online (Sandbox Code Playgroud)我添加了一个自定义的WADL生成器:
public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator(WadlGeneratorApplicationDoc.class)
.prop("applicationDocsStream", "application-doc.xml")
.generator(WadlGeneratorGrammarsSupport.class)
.prop("grammarsStream", "application-grammars.xml")
.descriptions();
}
}
Run Code Online (Sandbox Code Playgroud)这样,当我点击时,下面出现在WADL中/rest/application.wadl:
<grammars>
<include href="../schema/schema.xsd"/>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>
Run Code Online (Sandbox Code Playgroud)
/rest/application.wadl/xsd0.xsd是从我的课程自动生成的,但与我最初的课程有很大的不同schema.xsd.除此之外,调用像wadl2java这个WADL 这样的工具失败了,大概是因为
/schema/schema.xsd …我正在使用xmllint --schema选项来验证我看起来像这样的XML
<XML>
<Active>True</Active>
</XML>
Run Code Online (Sandbox Code Playgroud)
在我的模式文件中,我有以下描述Active元素的行.
<xsd:element name="Active" type="xs:boolean" />
Run Code Online (Sandbox Code Playgroud)
当我运行xmllint时,我会收到错误消息
/tmp/schema_validation.xml:73:element Active:架构有效性错误:元素'Active':'True'不是原子类型'xs:boolean'的有效值.
当我将XML更改为
<Active>true</Active>
Run Code Online (Sandbox Code Playgroud)
然后错误消息消失.
所以,它看起来像xsd:boolean意味着它全部小写为"true/false"而不是xmllint的"True/False".我的问题是,如何使xmllint接受xsd:boolean类型的"True"?或者我可以使用哪些工具来验证这个XML?此时更改XML或架构不是我的选择.
谢谢!
我目前正在使用JAXB生成java类以解组XML.现在我想创建一个与第一个非常类似的新模式,并使生成的类实现相同的接口.
比方说,我有两个模式文件,用于定义具有相似标签的XML:
adult.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
kid.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
使用JAXB和XJC我想生成两个类文件:
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person …Run Code Online (Sandbox Code Playgroud) 文档似乎说它引用了模式中的另一个元素,但是如何使用它 - 我从未在我使用过的模式中看到它.
任何人都有任何好的用例或可以进一步解释其使用的东西?
我想了解在XML Schema和WSDL中使用的targetNamespace的目的.实际上,为了简单起见,我们将这个问题限制为XML Schema.
我觉得我完全理解(简单)XML命名空间的概念.按照惯例,我们使用URI/URL,但我们可以使用任何字符串,然后我们将其分配给前缀以供XML节点和属性重用,或者仅用作手头作用域的默认命名空间.到现在为止还挺好 ?
现在进入XML Schema.出于某种原因,XML Schema的发明者认为简单命名空间的概念是不够的,他们不得不引入targetNamespace.我的问题是:targetNamespace引入了哪些重要的好处,而普通的XML命名空间无法提供这些好处?如果XML文档通过schemaLocation或import语句引用xsd文档,则在任何一种情况下,我都会给出引用的实际xsd文档的路径.这是唯一定义我想要引用的Schema的内容.如果另外我想将此Schema绑定到我的引用文档中的特定命名空间,为什么我必须复制已在我引用的XML Schema中定义的精确targetNamespace?为什么我不能简单地重新定义这个命名空间,但我想在XML文档中使用这个命名空间来引用我想引用的特定XML Schema文档?
更新:
举个例子,如果我在XML实例文档中有以下内容:
<p:Person
xmlns:p="http://contoso.com/People"
xmlns:v="http://contoso.com/Vehicles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://contoso.com/schemas/Vehicles
http://contoso.com/schemas/vehicles.xsd
http://contoso.com/schemas/People
http://contoso.com/schemas/people.xsd">
<name>John</name>
<age>28</age>
<height>59</height>
<v:Vehicle>
<color>Red</color>
<wheels>4</wheels>
<seats>2</seats>
</v:Vehicle>
</p:Person>
Run Code Online (Sandbox Code Playgroud)
为什么例如people.xsd Schema需要定义一个"http://contoso.com/schemas/People"的targetNamespace?为什么我们需要xsd文档中的targetNamespace定义?在我看来,您必须从schemaLocation的名称空间部分获得的所有内容已经包含在XML实例文档中.在xsd文档中强制存在具有相等值的targetNamespace有什么好处?
保罗回答的后续问题:
你能给我一个具体的例子,说明xsd元素名称之间的这种"冲突"变得明显,这可以解释对targetNamespace的需求吗?
好的,这是试图回答我自己的问题.如果它对您来说似乎是连贯的,请告诉我.查看保罗链接页面上的示例帮助了我.
如果我们在上面的原始问题中采用XML实例示例,我们有两个对车辆元素定义的引用.一个在XML实例文档本身中是显式且可见的,但我们还必须想象person.xsd XML Schema再次引用相同的车辆定义作为person的允许子元素.如果我们使用的每个文件都允许定义自己的车辆命名正常的命名空间,我们怎么会知道XML实例引用相同的XML模式定义为车辆因为是person.xsd?唯一的方法是强制执行命名空间的概念,该概念比原始的简单概念更严格,并且必须在多个文档中以完全相同的方式编写.
如果我不在平板电脑上写这个,我会提供一个代码示例,但在这里我将尝试描述我想到的例子.
想象一下,我们对车辆元素有两种不同的XML Schema定义.LOCATION1/vehicles.xsd将包含从该职位的问题验证(包含颜色,车轮和座位子元素)的例子中的定义,而LOCATION2/vehicles.xsd将包含一个完全不同的定义的车辆元件(比方说,包含子元素年份,型号和体积).现在,如果XML实例文档引用了location1 Schema,就像上面示例中的情况一样,但是person.xsd说person元素可以包含在location2 Schema中定义的类型的vehicle子元素,那么没有概念对于targetNamespace,XML实例将验证,即使它显然没有正确类型的车辆作为其person元素的子元素.
目标命名空间然后帮助我们确保如果两个不同的文档引用相同的第三个XML模式,它们都是引用相同模式的契约,而不仅仅是包含相似但彼此不相同的元素的模式. .
这有任何意义吗 ?
我试图定义一个包含一个只能包含以下三个值之一的字段的XSD:
本质上,我想在Schema级别定义严格的枚举.
我的第一次尝试看似错误,我不确定解决它的"正确"方法.
<xs:element name="color">
<xs:complexType>
<xs:choice>
<xs:element name="green"/>
<xs:element name="red"/>
<xs:element name="blue"/>
</xs:choice>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
通过使用自动XML生成器,它将这些元素名称视为字符串对象:
<xs0:color>
<xs0:green>text</xs0:green>
</xs0:color>
Run Code Online (Sandbox Code Playgroud) 我想使用DTD或XSD来描述我的XML文档.我已经读过XSD比DTD更好,因为它们支持命名空间和数据类型,并且DTD更老.
这是否意味着我应该只将XSD用于未来的所有需求并完全忽略DTD作为选项?我是否应该费心学习DTD的结构?
在XSD和DTD之间进行选择时,我应该考虑哪些因素?
使用模式验证XML文档.
最简单的问题形式显示在两个文件中.
<?xml version="1.0"?>
<recipe
xmlns:r="http://www.namespace.org/recipe">
<r:description>
<r:title>sugar cookies</r:title>
</r:description>
</recipe>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:r="http://www.namespace.org/recipe">
<xsd:complexType name="recipe">
<xsd:choice>
<xsd:element name="description" type="descriptionType"
minOccurs="1" maxOccurs="1" />
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="descriptionType">
<xsd:all>
<xsd:element name="title">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="5" />
<xsd:maxLength value="55" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
来自xmllint的完整错误消息:
file.xml:4:元素配方:模式有效性错误:元素'配方':没有可用于验证根的匹配全局声明.
确保给定模式可用于成功验证给定XML文档的正确语法(或缺少哪些模式属性)是什么?
我在使用XSD文件时遇到了困难.
我正在尝试从类创建一个XSD文件:
public enum Levels { Easy, Medium, Hard }
public sealed class Configuration
{
public string Name { get;set; }
public Levels Level { get; set; }
public ConfigurationSpec { get;set;}
}
public abstract class ConfigurationSpec { }
public class ConfigurationSpec1
{
// ...
}
public class ConfigurationSpec2
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在Configuration中有一个抽象类.有了这个功能,是否有可能创建XSD,如果可能的话?
我们的想法是将类配置传递给XSD.
我在XML文件中引用我的XML Schema时遇到了这个问题.
我在这条道路上有我的XSD:
C:\environment\workspace\maven-ws\ProjectXmlSchema\email.xsd
Run Code Online (Sandbox Code Playgroud)
但是当我在我的XML文件中尝试找到这样的架构时,找不到XSD:
<?xml version="1.0" encoding="UTF-8" ?>
<email xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com
file://C://environment//workspace//maven-ws//ProjextXmlSchema//email.xsd">
Run Code Online (Sandbox Code Playgroud)
找到XSD的唯一方法是它在同一个文件夹中:
xsi:schemaLocation="http://www.w3schools.com email.xsd"
Run Code Online (Sandbox Code Playgroud)
所以问题是:如果XML文件与XSD文件不在同一个文件夹中,那么路径必须如何才能找到XSD?
顺便说一句,我一直在使用的例子来自MSDN:他们声称它应该按照我试图的方式工作.但事实并非如此.