我有一个关于在我的xml架构(xsd)中添加限制的问题.我有一个复杂的类型:
<xsd:complexType name="xxx">
<xsd:attribute/>
.....
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
我在这个复杂类型中有很多属性,其中很少有字符串类型.现在我希望将这些字符串类型属性限制为y no.chars,我该如何添加此限制?
谢谢!-Ankush
我web.xml文件的顶部如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
version="2.5">
Run Code Online (Sandbox Code Playgroud)
但我仍然得到Eclipse(Ganymede)的警告,即没有检测到XML模式,并且没有警告模式违规.我的项目中的其他XML文件(例如Spring Framework配置文件)没有警告,并且确实给出了有关模式违规的正确警告.
如何让架构检查工作,希望警告消失?服务器运行正常.它似乎是一个IDE问题.
我正在编写一个XML模式(XSD)来描述我们的合作伙伴应该向我们发送数据的格式.
而且我很难找到可以验证我编写的XSD架构文件的工具.
到目前为止,我发现的最好的方法是首先编写一个示例输入XML文件,然后尝试使用XSD 验证它.但这并不是一种最佳操作策略.
那么,我该如何验证XML模式呢?
我无法理解以下XML架构的行为:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="rootnode">
<xsd:complexType>
<xsd:sequence>
<xsd:choice minOccurs="1" maxOccurs="2">
<xsd:element name="e1" minOccurs="1" maxOccurs="2"/>
<xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
我期望任何一个元素的至少一个实例<e1>或<e2>作为孩子的必需品<rootnode>.尽管我的期望,空的<rootnode>将验证这个架构:
> xmllint --schema test.xsd empty.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
</rootnode>
empty.xml validates
Run Code Online (Sandbox Code Playgroud)
如果我将minOccurs元素的属性更改为e2其他内容"0",我会得到我最初预期的行为.
似乎仅仅缺少元素<e2>就像xsd:choice我的例子中出现的一样.
如果是这种情况,那么为什么这无限次的出现不会违反maxOccurs我的限制xsd:choice呢?
我有一个像下面这样的标准代码来验证xml对xsd,但它在第一次错误时抛出异常并停止.如何验证xml,但继续第一个和下一个错误并最终得到它们?它甚至可能吗?
public static void validate(File xml, InputStream xsd) {
try {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(xsd));
Validator validator = schema.newValidator();
StreamSource xmlFile = new StreamSource(xml);
validator.validate(xmlFile);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 也许是我,但似乎你有一个XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="User">
<xs:complexType>
<xs:sequence>
<xs:element name="GivenName" />
<xs:element name="SurName" />
</xs:sequence>
<xs:attribute name="ID" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
它定义了此文档的架构
<?xml version="1.0" encoding="utf-8" ?>
<User ID="1">
<GivenName></GivenName>
<SurName></SurName>
</User>
Run Code Online (Sandbox Code Playgroud)
它将无法验证您是否添加了另一个元素,例如EmailAddress,并混淆了订单
<?xml version="1.0" encoding="utf-8" ?>
<User ID="1">
<SurName></SurName>
<EmailAddress></EmailAddress>
<GivenName></GivenName>
</User>
Run Code Online (Sandbox Code Playgroud)
我不想将EmailAddress添加到文档中并将其标记为可选.
我只想要一个XSD来验证文档必须满足的最低要求.
有没有办法做到这一点?
marc_s在下面指出你可以使用xs:any内部xs:sequence允许更多元素,遗憾的是,你必须维护元素的顺序.
或者,我可以使用xs:all哪个不强制执行元素的顺序,但是,唉,不允许我放在xs:any它内部.
XML有时会让我感到困惑,但我正试图解决这个问题.供应商告诉我的内容没有意义但是,我和XML并不相处:)
我有一些XML,我发送给供应商的Web服务,给我随机的失败:
<root>
<Request>
<Driver id="1" VehId="1">...</Driver>
<Driver id="2" VehId="1">...</Driver>
<Driver id="3" VehId="2">...</Driver>
<Vehicle id="1">...</Vehicle>
<Vehicle id="2">...</Vehicle>
<Driver id="4" VehId="2">...</Driver>
</Request>
</root>
Run Code Online (Sandbox Code Playgroud)
没有要比较的XSLT或XSD,以查看我的XML是否有效.
供应商声明XML无效,因为Driver#4位于错误的区域.驱动程序的XPath应该是root/Request/Driver,Vehicle是root/Request/Vehicle.
XML解析器是否会强制执行元素顺序,特别是如果没有XSD来比较XML?供应商对我的支持很慢,所以我想知道什么是好的常见做法.
跟进
我抱怨我们的帐户代表不能测试这个(并且听起来好像他们只是想获得支持资金),事实证明开发人员有XSD,但支持没有.所以我一直在和错误的小组交谈*facepalm*
我得到了XSD,它确实强制执行特定的元素顺序.
现在就他们自己的样本XML来对抗它们并不遵循模式,但至少现在我有一些东西需要测试.
我最近不得不迁移到新机器并重新安装Eclipse.目前,我需要从xsd生成JAXB类.我不记得我安装了什么,但在我的旧Eclipse中我有选择-rightclick-generate-jaxb类.
谁知道我需要安装什么/插件来取回它?
我正在考虑安装Dali,看起来它可能是正确的,但我很确定我上次没有安装Dali.我还在我的构建路径中包含了jaxb jar,就像上次一样,所以应该没问题.
我正在使用Eclipse 3.6和Java SE 1.6.
当我使用xsd.exe从xsd模式生成ac#类时,我觉得这个行为有点奇怪.
我的元素:
<xs:element name="InvoiceNo" type="xs:integer"/>
Run Code Online (Sandbox Code Playgroud)
生成为:
[System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=5)]
public string InvoiceNo
{
...
}
Run Code Online (Sandbox Code Playgroud)
为什么该属性不是作为int而不是字符串生成的?
使用Android SDK,普通空活动中的以下代码将失败:
@Override
protected void onStart() {
super.onStart();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
}
Run Code Online (Sandbox Code Playgroud)
2.2模拟器logcat显示此异常:
06-28 05:38:06.107: WARN/dalvikvm(495): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-28 05:38:06.128: ERROR/AndroidRuntime(495): FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.HelloWorldActivity}: java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema
at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:194)
at com.example.HelloWorldActivity.onStart(HelloWorldActivity.java:26)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
at android.app.Activity.performStart(Activity.java:3781)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
... 11 …Run Code Online (Sandbox Code Playgroud)