设为首页 收藏本站
查看: 690|回复: 0

[经验分享] apache的xmlbeans项目中自带demo(名称为Validation)的一个小错误

[复制链接]

尚未签到

发表于 2017-1-13 09:47:59 | 显示全部楼层 |阅读模式
这个例子中包含几个文件,分别是todolist.xsd,todolist.xml,Validation.java,ValidationTest.java

下面分别复制其代码:
Validation.java:
/*   Copyright 2004 The Apache Software Foundation
*
*   Licensed under the Apache License, Version 2.0 (the "License");
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*   See the License for the specific language governing permissions and
*  limitations under the License.
*/

package org.apache.xmlbeans.samples.validation;

import org.apache.xmlbeans.*;
import org.apache.xmlbeans.samples.validation.todolist.*;
import org.apache.xmlbeans.samples.validation.todolist.TodolistDocument.Todolist;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

/**
* A sample to illustrate two means for validating XML against schema
* using features of the XMLBeans API. The features illustrated are:
*
* - Validating after changes by using the XmlObject.validate method.
* This method is exposed by types generated by compiling schema. The
* validate method validates instances against all aspects of schema.
* Also, with this method you can specify a Collection instance to
* capture errors that occur during validation.
*
* - Validating "on the fly" using the XmlOptions.VALIDATE_ON_SET constant.
* This option prompts XMLBeans to validate XML against simple schema types
* <em>as you set them</em>, rather than by expressly calling for validation.
* You can set this option by calling XmlOptions.setValidateOnSet, then
* specifying the XmlOptions instance as a parameter when creating
* a new instance from schema or parsing an existing one.
*
* Note that it is also possible to validate instances from the
* command line by using tools you'll find in the bin directory of the
* XMLBeans distribution.
*/
public class Validation
{
    private static XmlOptions m_validationOptions;

    /**
     * Receives a todo list XML instance, twice rendering it invalid
     * and validating it using the XMLBeans API.
     *
     * @param args An array in which the first item is a
     * path to the XML instance file.
     */
    public static void main(String[] args)
    {
        Validation thisSample = new Validation();
        
        // Use the validate method to validate an instance after
        // updates.
        boolean isValidAfterChanges = thisSample.isValidAfterChanges(args[0]);
        
        // Use the VALIDATE_ON_SET option to validate an instance
        // as updates are made.
        boolean isValidOnTheFly = thisSample.isValidOnTheFly(args[0]);
    }

    /**
     * Illustrates use of the validate method by making changes to incoming
     * XML that invalidate the XML, then validating the instance and
     * printing resulting error messages.
     *
     * Because this code is designed to generate invalid XML, it
     * returns false when successful.
     *
     * @param xmlPath A path to the XML instance file.
     * @return <code>true if the XML is valid after changes;
     * otherwise, <code>false</code>.
     */
    public boolean isValidAfterChanges(String xmlPath)
    {
        System.out.println("Validating after changes: \n");
        // Set up the validation error listener.
        ArrayList validationErrors = new ArrayList();
        m_validationOptions = new XmlOptions();
        m_validationOptions.setErrorListener(validationErrors);

        TodolistDocument todoList = (TodolistDocument)parseXml(xmlPath, null);

        // Schema defines the <name> element as required (minOccurs = '1').
        // So this statement renders the XML invalid because it sets the
        // <name> element to nil.
        todoList.getTodolist().getItemArray(0).setName(null);

        // During validation, errors are added to the ArrayList for
        // retrieval and printing by the printErrors method.
        boolean isValid = todoList.validate(m_validationOptions);

        if (!isValid)
        {
            printErrors(validationErrors);
        }
        return isValid;
    }

    /**
     * Illustrates the "validate on set" feature, which validates XML
     * for simple types on the fly. As XML for those types is "set" through
     * accessors generated by compiling schema, XMLBeans checks the XML's
     * validity. The code here uses generated types to retrieve the first
     * <item> in a <todolist>, then update the <item>'s id attribute. The code
     * throws an exception when it tries to set an id attribute value that
     * is too high.
     *
     * Because this code is designed to generate invalid XML, it
     * returns false when successful.
     *
     * @param xmlPath A path to the XML instance file.
     * @return <code>true</code> if valid XML is successfully created;
     * otherwise, <code>false</code>.
     */
    public boolean isValidOnTheFly(String xmlPath)
    {
        System.out.println("Validating on-the-fly: \n");
        m_validationOptions = new XmlOptions();
        m_validationOptions.setValidateOnSet();
        
        TodolistDocument todoList = (TodolistDocument)parseXml(xmlPath, m_validationOptions);
        Todolist list = todoList.getTodolist();
        ItemType firstItem = list.getItemArray(0);

        // Schema defines the <id> element as allowing values up to 100. So
        // this line throws an exception because it invalidates the XML the
        // code is updating.
        firstItem.setId(8587);
        
        // This line will not be reached.
        return todoList.validate();
    }

    /**
     * Receives the collection containing errors found during
     * validation and print the errors to the console.
     *
     * @param validationErrors The validation errors.
     */
    public void printErrors(ArrayList validationErrors)
    {
        System.out.println("Errors discovered during validation: \n");
        Iterator iter = validationErrors.iterator();
        while (iter.hasNext())
        {
            System.out.println(">> " + iter.next() + "\n");
        }
    }

    /**
     * <p>Creates a File from the XML path provided in main arguments, then
     * parses the file's contents into a type generated from schema.</p>
     * <p/>
     * <p>Note that this work might have been done in main. Isolating it here
     * makes the code separately available from outside this class.</p>
     *
     * @param xmlFilePath A path to XML based on the schema in inventory.xsd.
     * @return An instance of a generated schema type that contains the parsed
     *         XML.
     */
    public XmlObject parseXml(String xmlFilePath, XmlOptions validationOptions)
    {
        File xmlFile = new File(xmlFilePath);
        XmlObject xml = null;
        try
        {
            xml = XmlObject.Factory.parse(xmlFile, validationOptions);
        } catch (XmlException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        return xml;
    }
}

ValidationTest.java:
/*   Copyright 2004 The Apache Software Foundation
*
*   Licensed under the Apache License, Version 2.0 (the "License");
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*   See the License for the specific language governing permissions and
*  limitations under the License.
*/

package org.apache.xmlbeans.samples.validation;

import org.apache.xmlbeans.samples.validation.Validation;

/**
* A class with which to test the Validation sample.
*/
public class ValidationTest
{
    /**
     * Tests the Validation sample.
     */
    public static void main(String[] args)
    {
        // all we're checking for is that the sample doesn't throw anything.
        // a real sample test might assert something more interesting.
        Validation sample = new Validation();
        // Use the validate method to validate an instance after
        // updates.
        boolean isValidAfterChanges = sample.isValidAfterChanges(args[0]);
        assert !isValidAfterChanges;
        
        // Use the VALIDATE_ON_SET option to validate an instance
        // as updates are made.
        boolean isValidOnTheFly = sample.isValidOnTheFly(args[0]);        
        assert !isValidOnTheFly;
    }
}


todolist.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2004 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<todolist xmlns="http://xmlbeans.apache.org/samples/validation/todolist">
    <item id="001">
      <name>Buy a south Pacific island.</name>
      <description>Contingent on inheriting lots of money.</description>
      <due_by>2005-05-01T23:36:28</due_by>
      <action>someday_maybe_defer</action>
    </item>
    <item id="002">
      <name>Get that new PowerBook I've been eyeing.</name>
      <description>Resulting productivity increase will be exponential!</description>
      <due_by>2005-05-01T23:36:28</due_by>
      <action>do</action>
    </item>
    <item id="003">
      <name>Clean the garage.</name>
      <description>Remove at least enough junk so that my bicycle fits.</description>
      <due_by>2005-05-30T23:36:28</due_by>
      <action>delegate</action>
    </item>
</todolist>

todolist.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2004 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<xs:schema targetNamespace="http://xmlbeans.apache.org/samples/validation/todolist" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://xmlbeans.apache.org/samples/validation/todolist" elementFormDefault="qualified">
<xs:element name="todolist">
<xs:complexType>
<xs:sequence>
<xs:element name="item" type="itemType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="itemType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="description" type="xs:string" minOccurs="0"/>
<xs:element name="due_by" type="xs:dateTime" minOccurs="0"/>
<xs:element name="action" type="actionType"/>
</xs:sequence>
<xs:attribute name="id" type="idType"/>
</xs:complexType>
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="idType">
<xs:restriction base="xs:int">
<xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="actionType">
<xs:restriction base="xs:string">
<xs:enumeration value="do"/>
<xs:enumeration value="delegate"/>
<xs:enumeration value="someday_maybe_defer"/>
<xs:enumeration value="toss"/>
<xs:enumeration value="incubate"/>
<xs:enumeration value="file"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

其中错误的地方在todolist.xsd,红色标记处(xs:string),这个错误导致
          <xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
无效。应该将其改为:nameType

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327808-1-1.html 上篇帖子: Apache 和 JBOSS做了个集群,运行了一段时间后最近发现宕机了三次 下篇帖子: Why do i get java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwa
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表