对XSD功能的另一个挑战是,
我一直在发送我的客户端的XML文件,这些文件将包含0个或更多未定义或[调用]意外标记(可能出现在层次结构中).好吧,它们对我来说是多余的标签..所以我必须忽略它们的存在,但是除此之外还有一些需要验证的标签.
这是一个示例XML:
<root>
<undefined_1>one</undefined_1>
<undefined_2>two</undefined_2>
<node>to_be_validated</node>
<undefined_3>two</undefined_3>
<undefined_4>two</undefined_4>
</root>
Run Code Online (Sandbox Code Playgroud)
和我试过的XSD:
<xs:element name="root" type="root"></xs:element>
<xs:complexType name="root">
<xs:sequence>
<xs:any maxOccurs="2" minOccurs="0"/>
<xs:element name="node" type="xs:string"/>
<xs:any maxOccurs="2" minOccurs="0"/>
</xs:sequence>
</xs:complexType
Run Code Online (Sandbox Code Playgroud)
由于某些原因,XSD不允许这样做.
上面提到的例子只是一个例子.实用的XML带有XML标签的复杂层次结构.
如果你能得到它,请告诉我.
顺便说一句,替代解决方案是在验证过程之前插入XSL转换.好吧,我正在避免它,因为我需要更改触发验证过程的.Net代码,至少我的公司支持验证过程.
我希望能够为多种扩展类型指定单选类型.
例如,说我们有海,在海里有很多种鱼.所以在XML中我会写:
<Sea name="Atlantic Ocean">
<Tuna name="tuna1" />
<Carp name="carp1" />
<Carp name="carp2" />
<Tuna name="tuna2" />
<Salmon name="salmon1" />
</Sea>
Run Code Online (Sandbox Code Playgroud)
<xs:complexType name="Fish">
</xs:complexType>
<xs:complexType name="Salmon">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Carp">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Tuna">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Sea">
<xs:complexContent>
<xs:extension base="GeoZone">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element type="Fish" name="Fish" minOccurs="0"
maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是无效的,因为我只能添加类型Fish本身而不是其扩展类型.
它甚至可能吗?
例:
<root children="2">
<child />
<child />
</root>
Run Code Online (Sandbox Code Playgroud) 这是我想要实现的一个小例子:
Maven Artifact A是许多Web服务之一,它定义了一个XSD Schema,其中包含Requests和Responses的定义.(SRC /主/资源/ XSD)
工件A取决于工件B,它是一个简单的JAR项目,包含大量具有低级类型描述的主XSD.(SRC /主/资源/ XSD)
工件A中的XSD使用在工件B中指定一次的类型定义(包含).
如果可能的话,我真的想知道如何包含位于jar中的xsd文件,这些文件作为maven依赖项加载,以及如何在像Netbeans和Eclipse这样的IDE中解析webservice xsd(和wsdl).
如果这种方法看起来异国情调 - 是否有更好的清洁设计实践?
更新
首先,这是一个简单的例子,说明我希望架构包括如何工作....
Artifact A (WAR Module)
POM:
...
<artifactId>A</artifactId>
...
<dependency>
<artifactId>B</artifactId>
...
</dependency>
Schema:
....
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/>
....
Artifact B (JAR Module)
Schema Location:
src/main/resources/net/elfwyn/xsd/schema.xsd
Run Code Online (Sandbox Code Playgroud)
对于像这样的问题似乎有几个解决方案,但我不知道如何在我的环境中实现它们:
我知道嵌入在(netbeans7.1)IDE中的目录解析器(对于dev environemnt)并且可用作Maven插件(用于生产环境),它应该能够指定模式文件位置的别名.然后,此别名应用作架构位置.
但是我不知道如何指定访问JAR文件中的模式的Catalog.xml.对我而言,它似乎与直接在架构位置中指定它相同.还有维护每个WAR项目目录的开销 - 如果可能的话我宁愿不去做.
关于Maven插件,我还没有找到任何结论.
其他来源在jax-b的上下文中实现了一个自定义目录解析器,但是我还没有看到在Java-WS环境中实现这样一个解析器的可能钩子,以及它应该如何与上面提到的maven-plugin一起工作或IDE目录解析器......
我正在尝试使用XSD 1.1创建一个模式定义,其中一个元素的结果依赖于其他元素.例如,我列出了每个国家/地区的国家/地区列表和州名列表.当一个人选择一个国家时,只能选择该国家的州.我想要达到的伪代码看起来像这样.
<xs:schema xmlns:ie="http://www.interviewexchange.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="country">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="USA" />
<xs:enumeration value="UK" />
<xs:enumeration value="India" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="state">
<xs:simpleType>
<xs:restriction base="xs:string">
<assert test="if (country eq 'USA')">
<xs:enumeration value="MA" />
<xs:enumeration value="AR" />
<xs:enumeration value="NY" />
</assert">
<assert test="if (country eq 'India')">
<xs:enumeration value="AP" />
<xs:enumeration value="TN" />
<xs:enumeration value="MP" />
</assert">
</xs:restriction>
</xs:simpleType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
请建议我是否遵循正确的方法,如果我遵循正确的方法,任何人都可以给我一些如何获得这种限制的代码吗?提前致谢...
我有以下xsd用于我的项目我试图根据付款方式枚举属性为xmls ACH和CC制作单个xsd如果付款方式是Ach然后ACHInfo变为必需其他CreditCardInfo ..
<xs:element name="PaymentMethod">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="ACH"/>
<xs:enumeration value="CreditCard"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="CreditCardInfo" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="Cvv2No">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="CardNumber">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="ACHInfo" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="RoutingNumber" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="AccountNumber" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
任何人都可以为我提供解决方案,根据枚举值,xsd需要更改所需的属性.
谢谢.
有什么方法可以在Intellij IDEA中打开XSD 1.1版的验证,而不是默认的1.0?据我所知,能够对版本1.1进行验证,处理器应该采用-xsdversion:1.1,但我没有在IDE中看到任何配置点如何设置它.
我使用Visual StudioXML工具创建了XSD.我使用以下C#代码来验证XML并面临此错误.
错误
该元素未声明为" http://www.w3.org/2000/09/xmldsig#:Signature ".
所以我的问题是如何解决它,因为在编辑模式下XML有效100%?
谢谢!
C#
private void buttonValidateXML_Click(object sender, EventArgs e)
{
try
{
bool result = IsValidXml2(textBoxSignedXML.Text, textBoxXSDFile.Text, "");
rtbValidationResult.Text = result.ToString();
}
catch (Exception ex)
{
rtbValidationResult.Text = ex.Message;
}
}
public static bool IsValidXml2(string xmlFilePath, string xsdFilePath, string namespaceName)
{
var xdoc = XDocument.Load(xmlFilePath);
var schemas = new XmlSchemaSet();
schemas.Add(namespaceName, xsdFilePath);
bool result = true;
xdoc.Validate(schemas, (sender, e) =>
{
result = false;
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
XML
<?xml version="1.0" encoding="utf-8"?>
<Envelope version="1"> …Run Code Online (Sandbox Code Playgroud) 我定期使用一些XML文件,并希望DTD可以提供更好的验证.所以我开始阅读有关模式的内容,看看是否会帮助我.到目前为止,我已经能够创造出几乎像我需要的东西,除了一件.我希望能够将元素的属性限制为具有相同元素类型的兄弟或祖先元素的不同属性的值.使用XML Schema密钥/ keyref限制是否可以实现这一点?
我有一个看起来像这样的文档:
<nodeContainer>
<node name="Table">
</node>
<node name="MyHouse">
<node name="RoomWithDoor">
</node>
<node name="DiningRoom" extends="RoomWithDoor">
<node name="DiningTable" extends="Table">
</node>
</node>
</node>
<node name="MySummerHouse">
<node name="DiningRoom">
<node name="DiningTable" extends="Table">
</node>
</node>
</node>
</nodeContainer>
Run Code Online (Sandbox Code Playgroud)
在本文档中,节点可以"扩展"以下其他节点:
但是,节点不应"扩展":
这意味着MyHouse可以"扩展" 表,这是没有意义的,但我没关系.
同样重要的是,两个房屋节点都应该能够拥有自己的名为DiningRoom的节点.
我目前的架构与此类似:
<xs:complexType name="node">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="node"/> <!-- node can have other nodes inside it -->
<xs:element ref="leaf"/>
</xs:choice>
<xs:attribute name="name" type="xs:anySimpleType" use="required"/>
<xs:attribute name="extends" type="xs:anySimpleType"/>
</xs:complexType>
<!-- document root -->
<xs:element …Run Code Online (Sandbox Code Playgroud) 我是一名刚接触XML和Web服务的java程序员.我正在尝试创建一个符合XSD(我没写过)的xml文档,其中包含下面的代码片段.我想要做的是调用此Web服务来复制邮件.有一个名为copy的元素,它是抽象类型"tns:CopyRequest".由于元素的类型是抽象的,Eclipse告诉我我不能创建一个.有一个CopyMailingRequest类型(听起来就像我想要的那样),但我不确定如何实例化它,因为没有扩展该类型的元素.我错过了什么?
<xs:element name="copy" nillable="true" type="tns:CopyRequest"/>
<xs:complexType name="CopyMailingRequest">
<xs:complexContent>
<xs:extension base="tns:CopyRequest">
<xs:sequence>
<xs:element name="fromId" type="tns:MailingId"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StandardMailingId">
<xs:complexContent>
<xs:extension base="tns:MailingId"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="MailingId">
<xs:complexContent>
<xs:extension base="tns:ObjectId"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="CopyRequest" abstract="true">
<xs:sequence>
<xs:element name="newName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)