ホームページ  >  記事  >  バックエンド開発  >  XML の簡潔なチュートリアル (7)

XML の簡潔なチュートリアル (7)

黄舟
黄舟オリジナル
2017-02-18 15:39:281646ブラウズ

目次


開発履歴

XMLと拡張可能なHTMLの比較

XMLと構文詳細のHTML比較

XML 検証 DTD

XML

XML 検証スキーマ

前回の記事で述べたように、検証対象の XML が定義した仕様(要素間の関係、しかし、要素の内容を検証したい場合、DTD は無力であるため、人々は新しい検証方法であるスキーマを研究しました。

上記の利点に加えて、スキーマ

DTDよりも優れています

それ自体が整形式の

XMLドキュメントであるため、

スキーマ

を書くことができるということですとても簡単です。独自の独立した構文

を持つ

DTD

と比較すると、記述と保守が非常に困難です。

スキーマファイルはXMLファイルなので、XMLに対応するXMLを記述するプロセスは、このようにXMLに対してXMLを記述することになります。とても簡単です。以下は、XML に基づいて対応するスキーマを記述する方法を示しています元の XML ファイル (test2.xml)

<?xml version="1.0"encoding="ISO-8859-1"?>
 
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</country>
 </shipto>
 <item>
  <title>Empire Burlesque</title>
  <note>Special Edition</note>
  <quantity>1</quantity>
  <price>10.90</price>
 </item>
 <item>
  <title>Hide your heart</title>
  <quantity>1</quantity>
  <price>9.90</price>
 </item>
</shiporder>




上記のXMLのために、スキーマの作成を始めましょう。従うべき原則は、人と対面して説明するのと同じように、元のXMLを記述し、対応するスキーマを記述する方法です。

スキーマコードは次のとおりです(shiporder。XML

のステートメントは詳しく説明する必要はありません。 2行目は、この

XML

の名前空間を定義しています(

Schema自体は

XML

です)。 4 行目から始まるのは、元の

XML

のいくつかの要件です:

首先定义了根元素为shiporder(行4),其次因为shiporder元素有一个属性,其中包含其他的元素所以其为复合类型(行5)。然后通过sequence元素按照顺序包围其子元素(行10---15),描述元素的名称以及元素的类型(行11----14),如果需要描述元素的限制条件(行22)。描述根元素的属性,由于是必选属性所以选择required关键字,需要注意的是这个属性必须放在最后(行29

通过Schema验证XML的代码和前面文章中的DTD验证大同小异,代码如下:

package ValidateXml;
 
import java.io.File;
import java.io.IOException;
 
import javax.xml.XMLConstants;
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.ErrorHandler;
import org.xml.sax.SAXException;
 
importcom.sun.org.apache.xml.internal.utils.DefaultErrorHandler;
 
public class XmlValidator
{
    private String xsdFilePath;
 
    public XmlValidator(String xsdFilePath)
    {
        this.xsdFilePath =xsdFilePath;
    }
 
    public String validata(String xmlFilePath,ErrorHandler errorHandler)
    {
        String msg = null;
        SchemaFactoryfactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        try
        {
           Schema schema = factory.newSchema(new File(xsdFilePath));
           Validator validator = schema.newValidator();
           validator.setErrorHandler(errorHandler);
           validator.validate(new StreamSource(new File(xmlFilePath)));
        }
        catch (SAXExceptione)
        {
           msg = e.getMessage();
           e.printStackTrace();
        }
        catch (IOExceptione)
        {
           msg = e.getMessage();
           e.printStackTrace();
        }
        return msg;
    }
 
    public static void main(String[] args)
    {
        String xmlFilePath ="d://test2.xml";
        String xsdFilePath ="d://shiporder.xsd";
        XmlValidator my =new XmlValidator(xsdFilePath);
        String msg =my.validata(xmlFilePath, new DefaultErrorHandler());
       System.out.println(msg == null);
    }
}

如果原XML文件符合Schema文件中的描述则返回true;否则抛出异常进行描述哪里不符合,并且返回false。(具体的操作可在实际工程中自行定制,这里只是进行简单的描述)



 以上就是XML简明教程(7) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。