【XML】浅析XML

目次

1.XMLの紹介

2、XML構文

     1.文書ステートメント

     2.ラベル(要素)

     3.プロパティ

     4.注意事項

     5.CDATAエリア

3、XMLの制約

      1.DTDの制約

          1.1ドキュメント形式

          1.2制約要素の理解

          1.3タグタイプ

          1.4定量化器

         1.5プロパティ宣言

     2.スキーマの制約

          2.1ドキュメント形式

4、XML解析

      1.3つの分析方法

      2.分析ツール

     3.分析原理と構造モデル 

     4.DOM4JとXPathの使用法と方法

          4.1一般的な方法

           4.2XPathの使用


1.XMLの紹介

       XML:そのフルネーム---「拡張可能な編集(タグ)言語。これは、独自の文法規則を持つ独立した言語です。それは本質的に「プレーンテキストファイル」です。XMLは、データを表示するのではなく、データを送信するように設計されており、XMLタグは事前定義されていません。タグは、自分で定義できます。

2、XML構文

XML構文の主なコンポーネント:ドキュメント宣言、タグ、属性、コメント、エスケープ文字、CDATA領域

     1.文書ステートメント

フォーマット:

<?xml version = “1.0(或者1.1)"  encoding = “UTF-8" ?>

効果:

ドキュメント宣言は、XMLファイルのエディターとパーサーが表示するためのものであり、XMLバージョンの構文とエンコード方法を識別するために使用されます。

予防:

1.標準のXMLドキュメントは通常、0行0列で定義されます

2.ドキュメントステートメントは必要ありません

     2.ラベル(要素)

タグ:「タグ、要素」とも呼ばれ、XMLの重要な部分です。

フォーマット:

1)完全なラベル: ----》 <名前>ジェームズ<名前>

2)単一ラベル(自動閉鎖およびラベル)   :----》 <student attribute = "attribute value" age = "18" />ラベル本体なし

予防:

1)ラベルの名前には、文字(中国語を含む)、数字、および4つの記号(_、-、:、。)のみを含めることができます。

2)数字と記号は開始できず、間に「スペース」を含めることはできません[英語で開始して英語で終了するようにしてください。中国語、数字、記号などは使用しないでください]

3)XMLタグは大文字と小文字を区別します

4)タグはネストできます

例:

<students>
    <student>
        <name>张三</name>
    </student>
</students>

     3.プロパティ

フォーマット:

属性は任意のタグに定義でき、完全なタグは開始タグにのみ書き込むことができ、自己終了し、タグは/の後に書き込むことはできません。

予防:

1)属性値は、二重引用符または一重引用符のペアで囲む必要があります

2)ラベルは複数の属性を持つことができますが、同じ名前を持つことはできません

3)ラベルは複数の属性を定義でき、各属性は「スペース」で区切る必要があります

<student id = “it001" name = “张三" age = “18" sex = “男"/>

     4.注意事項

フォーマット:

<!-コメント内容->

予防:

1)「ラベル名」にコメントを記入することはできません

2)マスターをネストすることはできません

<!-- 学员信息-->
<students>
    <student>
        <!-- 学员信息-->
        <name>张三</name>
        <age>19</age>
    </student>
</student>

     5.CDATAエリア

XMLには、(>、<、&など)などの固有のキーシンボルがいくつかあります。この種の文字は、XMLのエンコードに影響を与えやすいです。この問題を解決する1つの方法は、変換区切り文字(一般的に使用されるいくつかの変換)を使用することです。定義は次のとおりです。

                

別の解決策は、CDATA領域にXMLコンテンツを書き込むことです

        CDATA領域のコンテンツはすべて、特別な記号のないテキストと見なされます。

<![CDATA[
        String str = “fjdsEFeafeEW1432”;
        int count = 0;
        for(int i = 0;i < str.length() ; i++){
            char c = str.charAt(i);
            if(c >= ‘0’ && c <= ‘9’){
                count++;
            }
        }
        System.out.println(“count = “ + count);
]]>

3、XMLの制約

        XML制約:XMLのアプリケーションでは、XMLを標準化するためにXMLにいくつかの制約を与える必要があります。アプリケーションプロセスには、2つのタイプの制約があります。1つはDTD制約であり、もう1つはスキーマ制約です。

         DTD制約:古いバージョンの制約に属し、構文は簡潔で、関数は比較的単一であり、一部の小さくて単純なドキュメントに適しています。

         スキーマ制約:複雑な構文と強力な機能を備えた新しいバージョン制約に属しています。大きくて複雑なドキュメントに適しています

          制約を使用して、以下を制限できます。

          1)ドキュメントに表示できるタグ2)タグ間の包含関係                                              

          3)タグが表示される順序4)タグの頻度など...

      1.DTDの制約

          1.1ドキュメント形式

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    在需要使用此dtd的xml中引入约束
    <!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

XMLで次のステートメントを使用して、制約を導入します。

<!DOCTYPE 书架 SYSTEM "book.dtd">

次に、XMLファイルのコンテンツの書き込みを開始できます。

<?xml version="1.0" encoding="utf-8" ?><!--文档声明-->
<!DOCTYPE 书架 SYSTEM "book.dtd"><!--引入DTD约束-->
<书架>
    <书>
        <书名></书名>
        <作者></作者>
        <售价></售价>
    </书>
</书架>

          1.2制約要素の理解

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    在需要使用此dtd的xml中引入约束
    <!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)><!--约束根元素是“书架”,“书架的子元素为书,”,“+”为数量词-->
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

          1.3タグタイプ

ラベルタイプ
ラベルタイプ コードの記述 説明
PCDATA (#PCDATA) 解釈された文字列データ
空の 空の 空の要素
どれか どれか いかなるタイプ
<!ELEMENT 售价 (#PCDATA)> <!--"售价"元素体为字符串数据-->
<!ELEMENT 出版日期 ANY> <!--"出版日期"元素体为任意类型-->
<!ELEMENT 版本号 EMPTY> <!--"版本号"元素体为空元素

          1.4定量化器

数量詞
数量詞 意味
* 要素は0〜複数表示できます
+ 要素は1〜複数表示できます
要素は0または1にすることができます
要素が順番に表示されます
| 要素はそれらの1つを選択する必要があります

         1.5プロパティ宣言

<!ATTLIST 标签名称
       属性名称  属性类型    属性说明>
属性タイプ
属性タイプ 意味
CDATA 属性はテキスト文字列です
ID 属性値は一意であり、数字で始めることはできません
列挙 実行範囲内の列挙
プロパティの説明
プロパティの説明 意味
#必須 属性は持っている必要があります
#IMPLIED 属性はオプションです
#修繕 プロパティ固定値
<!ATTLIST 书                                <!--设置"书"元素的的属性列表-->
        id ID #REQUIRED                     <!--"id"属性值为必须有-->
        编号 CDATA #IMPLIED                  <!--"编号"属性可有可无-->
        出版社 (清华|北大|传智播客) "传智播客" <!--"出版社"属性值是枚举值,默认为“传智播客”-->
        type CDATA #FIXED "IT"              <!--"type"属性为文本字符串并且固定值为"IT"-->
>

     2.スキーマの制約

後で紹介する簡単な文法

          2.1ドキュメント形式

<?xml version="1.0" encoding="UTF-8" ?>
<!--
	将注释中的以下内容复制到要编写的xml的声明下面
	复制内容如下:
	<书架 xmlns="http://www.itcast.cn"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
    >
 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
    <xs:element name='书架' >
        <xs:complexType>
            <xs:sequence maxOccurs='unbounded' >
                <xs:element name='书' >
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='书名' type='xs:string' />
                            <xs:element name='作者' type='xs:string' />
                            <xs:element name='售价' type='xs:double' />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

schame制約:データのタイプを制約できます

4、XML解析

      1.3つの分析方法

1. DOM分析:ドキュメントのすべてのコンテンツを一度にメモリに読み込み、メモリ内にDOMツリーモデルを生成します。

[長所:要素を追加または削除できます。短所:処理とメモリ使用量が遅く、小さなファイルにのみ適しています]

2. SAX分析:一度に1行を読み取り、1行を解析します(読み取りのみ)

[長所:処理が高速で、メモリを使用しません。短所:ドキュメント構造がないため、ドキュメントのコンテンツを追加または削除できません]

3.プル分析:Androidの分析方法

      2.分析ツール

1)JAXP解析:JDKに付属の解析ツールは原始的で低レベルであるため、使用するのは便利ではありません。

2)JSOUP解析:HTMLの解析(Webクローラー)

3)JDOM分析:DOM4Jの兄弟であり、関数は比較的弱く、めったに使用されません

4)DOM4J解析:最も広く使用されているXML解析ツールの1つであり、DOMとSAXの解析方法を内部的に組み合わせています。

     3.分析原理と構造モデル 

        解析原理:XMLDOMはHTMLDOMと同じです。XMLファイルがメモリにロードされ、DOMツリーが生成され、Documentオブジェクトが取得されます。DOMはDocumentオブジェクトを介して操作できます。

構造モデル:

                        

     4.DOM4JとXPathの使用法と方法

使用手順:

    1)dom4jはサードパーティの「パッケージ」です

    リンク:https 
    ://pan.baidu.com/s/1SPxnd7yP_SsgygNKee9Qsw抽出コード:kcv6

    2)dom4j jarパッケージをモジュールディレクトリにコピーし、右クリックしてクラスライブラリに追加します(ライブラリとして追加)

          4.1一般的な方法

工法
方法 効果
新しいSAXReader saxreaderオブジェクトを作成します(構築メソッド)
ドキュメントの読み取り(文字列のURL) xmlドキュメントをロードして実行します
ドキュメントオブジェクト
方法 効果
要素getRootElement() ルート要素を取得します
要素オブジェクト
方法 効果
List <Element> elements([String element]) ルート要素の子要素を取得します(ルート要素名を指定することも指定しないこともできます)
要素element([文字列要素]) 最初の子要素を取得します(要素名を指定することも指定しないこともできます)
文字列getName() 現在の要素の名前を取得します
string attributeValue(string attrName) 指定された属性名の属性値を取得します
string elementText(string element) 指定されたname要素のテキスト値を取得します
文字列getText() 現在の要素のテキストコンテンツを取得します
public class Test {
    public static void main(String[] args) throws DocumentException {
        //3、利用类加载器创建InputStream流对象
        InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
        //1、创建saxReader对象
        SAXReader saxReader = new SAXReader();
        //2、读取xml文件,获取DOM对象
        Document document = saxReader.read(in);
        //4、获取XML文件的根目录
        Element rootElement = document.getRootElement();

        //5、通过根元素对象获取子元素对象
        List<Element> listElements = rootElement.elements();
        //6、遍历子元素对象
        for (Element listElement : listElements) {
            //获取子元素的id属性名
            /*Attribute name = listElement.attribute("id");
            String value = name.getValue();
            System.out.println(value);
            */
            //获取子元素的子元素
            //  List<Element> elements = listElement.elements();
            // // //遍历子元素集合
            // for (Element childElement : elements) {
            //     //获取指定标签的文本数据
            //     // System.out.println(childElement.getText());//1
            //     // System.out.println(childElement.getStringValue());//2
            // }
            //3、根据名称获取元素
            Element name = listElement.element("name");
            //根据元素获取标签数据
            String text = name.getText();
            //输出值
            System.out.println(text);
            // 4、
            // System.out.println(listElement.elementText("name"));
        }
    }
}

           4.2XPathの使用

在DOM4J的基础上,在此导入jaxen-1.1-beta-6.jar包

链接:https://pan.baidu.com/s/1Q5QgiVsdz-v1U-ThpC-gag 
提取码:0lix

可以直接写出想要获取文本信息的路径,然后使用selectISingleNode就可以获取:

public class Test {
    public static void main(String[] args) throws DocumentException {
        //3、利用类加载器创建输出流对象
        InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
        //1、创建 Saxreader对象
        SAXReader saxReader = new SAXReader();
        //2、读取xml文件,获取DOM对象
        Document document = saxReader.read(in);
        //4、获取xml文件的根元素
        Element rootElement = document.getRootElement();
        //5、获取指定标签的文本数据
        Node node = rootElement.selectSingleNode("/books/book/name");
        //6、获取节点的文本数据并解析
        System.out.println(node.getText());
    }
}

 

おすすめ

転載: blog.csdn.net/weixin_43267344/article/details/108268887