在Java中针对XML Schema 1.1验证XML文件的最佳方法是什么?
我从本教程中获取了代码并更改了它在工厂中查找的行以使用XML Schema 1.1,正如我在Xerces FAQ的代码示例中看到的那样.
这是我的代码:
import java.io.File;
import java.io.IOException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class XSDValidator {
private static void validateFile(File xmlFile, File xsdFile) throws SAXException, IOException
{
// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
// SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 2. Compile the schema.
File schemaLocation = xsdFile;
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a …Run Code Online (Sandbox Code Playgroud) 我试图在XSD中使用以下内容
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
<xs:element name="dimension">
<xs:complexType>
<xs:attribute name="height" type="xs:int"/>
<xs:attribute name="width" type="xs:int"/>
<xs:assert test="@height = @width"/>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
我知道assert/assertion是XML Schema 1.1的一部分,但不是1.0.但是我读过的所有内容都表明两者的名称空间相同:http://www.w3.org/2001/XMLSchema
一个小问题是我用来编写Schema(Microsoft Visual Studio)的程序无法识别'assert'元素,说' 命名空间中的元素complexType(...)具有无效的子元素'assert'.
主要的问题是,当我实际尝试使用xmllint对此模式验证XML时,它会抛出一个错误说
" element assert: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))
Run Code Online (Sandbox Code Playgroud)
虽然被指向了1.1名称空间,但xmllint/visual studio却无法识别1.1吗?
如果我创建一个需要模式1.1特性的XML模式(特别是微妙的模式,比如删除基类型限制中的可选元素),那么表明该模式不应该与仅理解版本的处理器一起使用的最佳方法是什么1.0?
在XSLT样式表文件中,可以指示使用version属性使用的XSLT规范的版本.
但是在XSD文件中,该version属性没有这个含义 - 它是一个自由格式的属性,它说明了模式的版本,而不是正在使用的规范的版本.
是否需要标记使用1.1功能的架构?
我有一组使用FPML 5.5规范和一些自定义模式的复杂模式,并且无法使用某些模式验证器进行验证,但我不确定这是因为验证器有错误还是因为模式巧妙地使用了xml模式1.1功能.
我有这个XML文件:
<Response>
<errorCode>error Code</errorCode>
<errorMessage>msg</errorMessage>
<ResponseParameters>
<className>
<attribute1>a</attribute1>
<attribute2>b</attribute2>
</className>
</ResponseParameters>
</Response>
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
<className>
<attribute1>a</attribute1>
<attribute2>b</attribute2>
</className>
Run Code Online (Sandbox Code Playgroud)
我当前的XSL文件还包含"ResponseParameters"标记,我不想要它.
编辑:请注意,节点className是动态的.我不知道这个名字在运行时会是什么.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" />
<xsl:template match="/">
<xsl:copy-of select="//ResponseParameters">
</xsl:copy-of>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud) 是否存在XML Schema XSD 1.1的任何现有C++实现?
我找到了xerces-c ++ - 3.1.1,但它只实现了XSD 1.0.这个项目的java版本确实实现了XSD 1.1.
我特别想找到一种实现'断言'功能的方法.
我正在尝试使用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)
请建议我是否遵循正确的方法,如果我遵循正确的方法,任何人都可以给我一些如何获得这种限制的代码吗?提前致谢...
XML架构1.1 <xs::redefine>和之间有什么区别<xs::override>.我面前有两本关于XML Schema的书籍,我仍然无法区分它们.我唯一确定的是两者都是普遍存在的并且已<xs::redefine>被弃用.
我们正在开发一个支持Web服务的MDA平台.用户可以在运行时提供WSDL,我们在内部使用JAX-WS生成所有工件(服务器的服务接口和实现,以及客户端的使用者).
我们希望在用户提供的WSDL文档上添加验证.现在,用户必须使用外部工具(如Oxygen,XMLSpy或Web工具)对其进行验证,但我们希望将其添加为系统的一部分.一个很好的功能是模式验证,包括WSDL的嵌入式模式.
在JAX-WS(RI)中,运行时支持模式验证(使用@SchemaValidation批注),但我们没有找到任何对WSDL验证的支持.
我们已经尝试集成Eclipse的WSDL验证器,但它似乎对我们没有用.
有没有办法用JAX-WS做到这一点?如果没有,是否还有其他可以整合的验证框架?
谢谢
我正在试图对xsd验证xml.以下是xsd
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="http://www.w3schools.com" targetNamespace="http://www.xxxxxxxxxxxxx/xxxxxxxx" xmlns:cl="http://www.xxxxxx/contactlist" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:complexType name="contactNumberType">
<xsd:all>
<xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="number" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="contactNumbersType">
<xsd:sequence>
<xsd:element name="contact_number" type="contactNumberType" minOccurs="1" maxOccurs="2"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="contactType">
<xsd:all>
<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="company" type="xsd:string" minOccurs="0" maxOccurs="1"/>
<xsd:element name="jobtitle" type="xsd:string" minOccurs="0" maxOccurs="1"/>
<xsd:element name="emailadress" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="addresses" type="addressesType" minOccurs="0" maxOccurs="1"/>
<xsd:element name="contact_numbers" type="contactNumbersType" minOccurs="1" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="addressType">
<xsd:all>
<xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="street_address1" …Run Code Online (Sandbox Code Playgroud) xsd ×8
xml ×7
xsd-1.1 ×6
c++ ×1
enums ×1
java ×1
jax-ws ×1
redefinition ×1
validation ×1
w3c ×1
web-services ×1
wsdl ×1
xslt ×1