GVKun编程网logo

针对XSD架构的Java XML验证(java xsd xml)

4

在本文中,我们将为您详细介绍针对XSD架构的JavaXML验证的相关知识,并且为您解答关于javaxsdxml的疑问,此外,我们还会提供一些关于6、xsd验证xml文件的java代码、c#–使用嵌套X

在本文中,我们将为您详细介绍针对XSD架构的Java XML验证的相关知识,并且为您解答关于java xsd xml的疑问,此外,我们还会提供一些关于6、xsd验证xml文件的java代码、c# – 使用嵌套XSD架构的XML验证错误 – 未声明类型、c# – 如何使用xmlschemaset和xmlreader.create对xsd模式验证xml、java – 使用Spring WS发布静态WSDL和相关的XSD架构的有用信息。

本文目录一览:

针对XSD架构的Java XML验证(java xsd xml)

针对XSD架构的Java XML验证(java xsd xml)

private void validateXML(DOMSource source) throws Exception {
    URL schemaFile = new URL("http://www.csc.liv.ac.uk/~valli/modules.xsd");
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
    Schema schema = schemaFactory.newSchema(schemaFile);

    Validator validator = schema.newValidator();
    DOMResult result = new DOMResult();
    try {
        validator.validate(source,result); 
        System.out.println("is valid");
    } catch (SAXException e) {
        System.out.println("not valid because " + e.getLocalizedMessage());
    }
}

但是,这将返回一条错误消息:线程“
main”中的异常java.lang.IllegalArgumentException:无法加载实现由http://www.w3.org/2001/XMLSchema
-instance 指定的模式语言的SchemaFactory。

这是我的代码还是实际的xsd文件有问题?

6、xsd验证xml文件的java代码

6、xsd验证xml文件的java代码

package com;
import java.io.ByteArrayInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
  
import javax.xml.XMLConstants;  
import javax.xml.stream.FactoryConfigurationError;  
import javax.xml.stream.XMLInputFactory;  
import javax.xml.stream.XMLStreamException;  
import javax.xml.stream.XMLStreamReader;  
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.apache.axiom.om.OMElement;  
import org.apache.axiom.om.impl.builder.StAXOMBuilder;  
import org.xml.sax.SAXException;  
  
public class validateXML {  
  
    /** 
     * XSD和XML文件放在工程的bin路径下 
     */  
    public static boolean validate(String schemaLocaltion,OMElement request)  
            throws SAXException,IOException {  
        // 获取Schema工厂类  
        // 这里的XMLConstants.W3C_XML_SCHEMA_NS_URI的值就是://http://www.w3.org/2001/XMLSchema  
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);  
        // 获取XSD文件,以流的方式读取到Source中  
        // XSD文件的位置相对于类文件位置  
        Source schemaSource = new StreamSource(new FileInputStream(schemaLocaltion));  
  
        Schema schema = factory.newSchema(schemaSource);  
        // 这里是将一个DOM树对象转换成流对象,以便对DOM树对象验证  
        // 如果是对XML文件进行验证,用FileInputStream即可  
        String input = request.toString();  
        ByteArrayInputStream bais = new ByteArrayInputStream(  
                input.getBytes("UTF-8"));  
        // 获取验证器,验证器的XML Schema源就是之前创建的Schema  
        Validator validator = schema.newValidator();  
  
        Source source = new StreamSource(bais);  
        // 执行验证  
        try {  
            validator.validate(source);  
            return true;  
        } catch (Exception ex) {  
            ex.printstacktrace();  
            return false;  
        } finally {  
            bais.close();  
        }  
    }  
  
    /** 
     * get OMElement soap request from specified XML file. 
     *  
     * @param request 
     * @return 
     * @throws FileNotFoundException 
     * @throws XMLStreamException 
     * @throws FactoryConfigurationError 
     */  
    public static OMElement getRequest(String filePath)  
            throws FileNotFoundException,XMLStreamException,FactoryConfigurationError {  
        XMLStreamReader reader = XMLInputFactory.newInstance()  
                .createXMLStreamReader(  
                        new FileInputStream(new File(filePath)));  
        StAXOMBuilder builder = new StAXOMBuilder(reader);  
        OMElement requestMessage = builder.getDocumentElement();  
        return requestMessage;  
    }  
  
    public static void main(String[] args) {  
        try {  
            if (validate("D:\\Documents\\2014.11work\\mzyw1.xsd",getRequest("D:\\Documents\\2014.11work\\mzyw1.xml"))) {  
                System.out.println("customer_err.xml格式良好");  
            } else {  
                System.out.println("customer_err.xml格式有误,请检查!");  
            }  
        } catch (Exception ex) {  
            ex.printstacktrace();  
            System.out.println("文件格式有误,请检查!");  
        }  
    }  
}  

c# – 使用嵌套XSD架构的XML验证错误 – 未声明类型

c# – 使用嵌套XSD架构的XML验证错误 – 未声明类型

我使用嵌套的XSD架构来验证XML文档.导入的XSD使用自己的目标命名空间,我可以使用Liquid XML Studio验证下面给出的示例XML.但是当我使用下面的C#代码运行验证时,它会因类型声明错误而失败(见下文).我花了很多时间试图搞清楚,但没有运气:

主XSD架构(DataItem.xsd):

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:Datanumeric="Doc.Datanumeric" xmlns:DataYesNo="Doc.DataYesNo"  attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="Datanumeric.xsd" namespace="Doc.Datanumeric" />
  <xs:import schemaLocation="DataYesNo.xsd" namespace="Doc.DataYesNo" />
  <xs:complexType name="tDataItem">
      <xs:choice>
        <xs:element name="Datanumeric" type="Datanumeric:tDatanumeric" />
        <xs:element name="DataYesNo" type="DataYesNo:tDataYesNo" />
      </xs:choice>
  </xs:complexType>
  <xs:element name="DataItem" type="tDataItem" />  
</xs:schema>

包含的XSD架构(Datanumeric.xsd):

**<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:Datanumeric="Doc.Datanumeric" elementFormDefault="qualified" targetNamespace="Doc.Datanumeric" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="tDatanumeric">
    <xs:sequence>
      <xs:element name="Answer" type="xs:double" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Datanumeric" type="Datanumeric:tDatanumeric" />
</xs:schema>**

XML:

<DataItem>
  <Datanumeric xmlns:Datanumeric="Doc.Datanumeric">
    <Datanumeric:Answer>37.8</Datanumeric:Answer>
  </Datanumeric>
</DataItem>

验证错误:

XmlSchemaValidationException:未声明类型“Doc.Datanumeric:tDatanumeric”.

C#验证码:

XDocument xDoc = XDocument.Parse(xxxxxxx);
string xsdpath = ConfigUtils.GetXsdpath(XsdSchemaIdentifier.HHDataItem);
FileStream fs = new FileStream(xsdpath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);
fs.Close();
fs.dispose();

xDoc.Validate(xss, null);

解决方法:

在经历了令人沮丧的一天半的迭代之后,我发现了这个问题.更改:

FileStream fs = new FileStream(xsdpath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", xsdpath);

解决了这个问题.但是我仍在寻找为什么回答?两者都是向架构集添加架构的有效方法(即2个重​​载).

c# – 如何使用xmlschemaset和xmlreader.create对xsd模式验证xml

c# – 如何使用xmlschemaset和xmlreader.create对xsd模式验证xml

我在我的程序中修复警告,显然xmlvalidating reader和xmlschemacollection已经过时了.问题是,我不太确定如何.这是尝试使用涉及xmlschemaset和xmlreader.create的新模板“模仿”先前的验证函数.我首先声明一个模式,然后使用targeturi字符串设置它,然后在设置验证事件处理程序时将其添加到模式集.我认为我的问题是设置读者和输入流.我知道如何使用xmlvalidating reader,但如果我想修复这些警告,那么这不是一个选项.这是代码和尝试.在测试期间,只使用了新的验证xml代码,旧的代码被注释掉了.

// New Validation Xml.
            string xsd_file = filename.Substring(0,filename.Length - 3) + "xsd";
            XmlSchema xsd = new XmlSchema();
            xsd.sourceUri = xsd_file;

            XmlSchemaSet ss = new XmlSchemaSet();
            ss.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            ss.Add(xsd);
            if (ss.Count > 0)
            {
                XmlTextReader r = new XmlTextReader(filename2);
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas.Add(ss);
                settings.ValidationEventHandler +=new ValidationEventHandler(ValidationCallBack);
                XmlReader reader = XmlReader.Create(filename2,settings);
                while (reader.Read())
                {
                }
                reader.Close();
            }

            // Old Validate XML
            XmlSchemaCollection sc = new XmlSchemaCollection();
            sc.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            sc.Add(null,xsd_file);
            if (sc.Count > 0)
            {
                XmlTextReader r = new XmlTextReader(filename2);
                XmlValidatingReader v = new XmlValidatingReader(r);
                v.ValidationType = ValidationType.Schema;
                v.Schemas.Add(sc);
                v.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
                while (v.Read())
                {
                }
                v.Close();
            }

    private void ValidationCallBack(object sender,ValidationEventArgs e)
    {
        // If Document Validation Fails
        isvalid = false;
        MessageConsole.Text = "INVALID. Check message and datagridview table.";
        richTextBox1.Text = "The document is invalid: " + e.Message;
    }

不幸的是,当我运行程序并尝试验证无效的xml文档时,它会给出一个如下错误:“未声明’URNLookup’元素.” URNLookup元素是xml文件的根元素.我总是可以回到旧的验证方法,但那些警告吓到了我.

任何帮助都非常感谢.先感谢您!如果我遗漏任何信息,我会很乐意提供更多信息.

> tf.rz(.NET 3.5 SP1,Visual Studio C#2008)

解决方法

我已经解决了这个问题,它现在又重新开始工作而没有任何警告.
在新验证XML中:

// New Validation Xml.
            string xsd_file = filename.Substring(0,filename.Length - 3) + "xsd";
            XmlSchema xsd = new XmlSchema();
            xsd.sourceUri = xsd_file;

            XmlSchemaSet ss = new XmlSchemaSet();
            ss.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            ss.Add(null,xsd_file);
            if (ss.Count > 0)
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas.Add(ss);
                settings.Schemas.Compile();
                settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
                XmlTextReader r = new XmlTextReader(filename2);
                using (XmlReader reader = XmlReader.Create(r,settings))
                {
                    while (reader.Read())
                    {
                    }
                }
            }

ss.add已更改为具有命名空间和文件字符串.添加了settings.schemas.compile(),并添加了“using(xmlreader reader … …”)的无关紧要的重组.

这页帮助了我很多:http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.80).aspx它现在有效.

java – 使用Spring WS发布静态WSDL和相关的XSD架构

java – 使用Spring WS发布静态WSDL和相关的XSD架构

我有一个模块,我有我的XSD架构,其中一个架构可以使用架构位置中的相对路径引用另一个架构:

在这里,我还使用xjc从这些xsd模式生成Jaxb bean.

现在我有一个模块,我的web服务是使用spring-ws(2.0.4)实现的.我想使用静态WSDL并使用xsd模式发布它,其中模式位置将转换为URL,如“http://myerver.url.com/my.xsd”.

问题是如何优雅地实现这一目标?

(或者将XSD合并到一个模式中,然后合并到WSDL中)

(理论上我可以使用脚本转换这些XSD并将它们添加到资源(xsd和wsdl)到(spring dispatcher)servlet,但在我看来它并不舒服)

最佳答案
Spring Web服务实际上可以优雅地实现它.
您需要做的就是在bean定义xml文件中定义一个具有正确id(将用作没有.xsd的xsd名称)的SimpleXsdSchema bean,如下所示

更多信息(包括示例)可在以下链接中找到:
Static WSDL with imported XML Schema in Spring Web Service

今天关于针对XSD架构的Java XML验证java xsd xml的分享就到这里,希望大家有所收获,若想了解更多关于6、xsd验证xml文件的java代码、c# – 使用嵌套XSD架构的XML验证错误 – 未声明类型、c# – 如何使用xmlschemaset和xmlreader.create对xsd模式验证xml、java – 使用Spring WS发布静态WSDL和相关的XSD架构等相关知识,可以在本站进行查询。

本文标签: