目次
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抽出コード:kcv62)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());
}
}