XmlPullParser(Java版)
以下は、XmlPullParser が XML ファイルを解析するための一般的なメソッドと手順です。
1. XmlPullParserFactory.newInstance():
XmlPullParserFactory インスタンスを作成します。
2. XmlPullParserFactory.setNamespaceAware(boolean):
XML名前空間をサポートするかどうかを設定します。
3. XmlPullParserFactory.setValidating(boolean):
DTD検証をサポートするかどうかを設定します。
4. XmlPullParserFactory.newPullParser():
XmlPullParser インスタンスを作成します。
5. XmlPullParser.setInput(InputStream, String):
解析するXMLファイルの入力ストリームとエンコード方式を設定します。
6. XmlPullParser.getEventType():
現在のパーサーのイベント タイプを取得します。
7. XmlPullParser.getName():
現在のノードの名前を取得します。
8. XmlPullParser.getText():
現在のノードのテキストコンテンツを取得します。
9. XmlPullParser.next():
次のノードに移動します。
10. XmlPullParser.nextTag():
次のラベル ノードに移動します。
11. XmlPullParser.getAttributeCount():
現在のノードの属性の数を取得します。
12. XmlPullParser.getAttributeName(int):
指定された位置にある現在のノードの属性名を取得します。
13. XmlPullParser.getAttributeValue(int):
指定された位置にある現在のノードの属性値を取得します。
14. XmlPullParser.getDepth():
現在のノードの深さを取得します。
15. XmlPullParser.END_DOCUMENT:
XML ファイルの終わりに達したことを示します。
16. XmlPullParser.START_TAG:
現在のノードがラベル ノードであることを示します。
17. XmlPullParser.END_TAG:
現在のノードが終了タグ ノードであることを示します。
解析順序: 開始タグ イベント ----> テキスト イベント ----> 終了タグ イベント
例えば:
<?xml version="1.0" encoding="utf-8"?>
<keys>
<board id="xml1">1
<source>android 01</source>2
<source>android 02</source>2
<source>android 03</source>2
</board>
<board id="xml2">1
<source>ios 01</source>3
<source>ios 02</source>3
<source>ios 05</source>3
</board>4
</keys>
コードを解析しています:
private void parseData(){
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
InputStream inputStream = getAssets().open("text.xml");
parser.setInput(inputStream,"utf-8");
int eventType = parser.getEventType();
String board = "";
while (eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.TEXT:
Log.d(TAG, "parseData: text " + parser.getName() + " " + parser.getText());
break;
case XmlPullParser.START_TAG:
String keys = parser.getName();
Log.d(TAG, "parseData: start -----" + parser.getName());
if (keys.equals("board")) {
board = parser.getAttributeValue(null, "id");
}
if (board.equals("xml1")) {
if (keys.equals("source")) {
// String result = parser.getText();
// Log.d(TAG, "initData: result = " + result);
// parser.next(); // 移动解析器到下一个事件,即 TEXT 事件
// String result = parser.getText();
// Log.d(TAG, "initData: result = " + result);
}
}
break;
case XmlPullParser.END_TAG:
Log.d(TAG, "initData: end -------" + parser.getName());
break;
}
eventType = parser.next();
}
} catch (IOException | XmlPullParserException e) {
throw new RuntimeException(e);
}
}
操作結果:
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: start -----keys
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: text null
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: start -----board
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: text null 1
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.553 22162-22162 MainActivity com.example.third D parseData: text null android 01
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null 2
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null android 02
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null 2
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null android 03
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null 2
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D initData: end -------board
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: text null
2023-06-06 14:35:41.554 22162-22162 MainActivity com.example.third D parseData: start -----board
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null 1
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null ios 01
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null 3
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null ios 02
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null 3
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null ios 05
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null 3
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D initData: end -------board
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D parseData: text null 4
2023-06-06 14:35:41.555 22162-22162 MainActivity com.example.third D initData: end -------keys
DocumentBuilderFactory(kotlin版)
org.w3c.dom.Node の一般的なメソッドと使用手順は次のとおりです。
1. getNodeName():
ノードの名前を取得します。
2. getNodeValue():
ノードの値を取得します。
3. getNodeType():
ノードのタイプを取得し、整数値を返します。具体的な値は次のとおりです。
- ELEMENT_NODE(1):
要素ノード
- ATTRIBUTE_NODE(2):
属性
- TEXT_NODE(3):
ノード テキストノード
- CDATA_SECTION_NODE(4):
CDATAノード
- ENTITY_REFERENCE_NODE(5):
実体参照ノード
- ENTITY_NODE(6):
実体ノード
- PROCESSING_INSTRUCTION_NODE(7):
処理命令ノード
- COMMENT_NODE(8):
コメントノード 文書
- DOCUMENT_NODE(9):
ノード
- DOCUMENT_TYPE_NODE(10):
文書型ノード 文書
- DOCUMENT_FRAGMENT_NODE(11):
断片ノード シンボル
- NOTATION_NODE(12):
ノード
4. getChildNodes():
ノードの子ノード リストを取得し、NodeList オブジェクトを返します。
-
getParentNode():
ノードの親ノードを取得し、Node オブジェクトを返します。 -
getAttributes():
ノードの属性リストを取得し、NamedNodeMap オブジェクトを返します。 -
hasChildNodes():
ノードに子ノードがあるかどうかを判断し、ブール値を返します。 -
getTextContent():
ノードのテキストコンテンツを取得し、文字列を返します。 -
getFirstChild():
ノードの最初の子ノードを取得し、Node オブジェクトを返します。 -
getLastChild():
ノードの最後の子ノードを取得し、Node オブジェクトを返します。 -
getNextSibling():
ノードの次の兄弟ノードを取得し、Node オブジェクトを返します。 -
getPreviousSibling():
ノードの前の兄弟ノードを取得し、Node オブジェクトを返します。
テスト ケースで使用される XML:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!--我是注释,也能被解析出来-->
<A>Apple</A>
我是A和B中间的文本
<B>Banana</B>
<C>我是C文本
<D>Dog</D>我是D和E之间的文本
<E>elephant</E>
</C>我是C和F之间的文本
<F>foot</F>我是F和G之间的文本
<G>god</G>
</config>
テストケースコード:
fun main() {
try {
val factory = DocumentBuilderFactory.newInstance()
val builder = factory.newDocumentBuilder()
val file = File("D:\\DevSpace\\IDEA\\Project\\GUIProject\\src\\kotlinLearning\\config.xml")
if(file.exists()){
val stream = file.inputStream()
val document = builder.parse(stream)
val rootElement = document.documentElement
println("${
rootElement.tagName} ${
rootElement.nodeName} ${
rootElement.nodeValue}")
println("============================================================================")
val nodeList = rootElement.childNodes
for(i in 0 until nodeList.length){
val configNode : Node = nodeList.item(i)
//单独判断C,有子标签的
if(configNode.nodeName == "C"){
val element = configNode as Element
println("tagName: ${
element.tagName} 节点name: ${
element.nodeName} 节点值: ${
element.nodeValue} ")
val childNodes = element.childNodes
for (j in 0 until childNodes.length){
val child = childNodes.item(j)
if(child.nodeType == Element.ELEMENT_NODE){
val firstChild = child.firstChild
val nodeValue = firstChild.nodeValue
val nodeName = firstChild.nodeName
println("launcherInfo子节点的名为:$nodeName 值为:$nodeValue")
}
}
}else{
println("Node的类型为: ${
configNode.nodeType} Node的名字为: ${
configNode.nodeName} Node的值为: ${
configNode.nodeValue} Node的子值为: ${
configNode.firstChild?.nodeValue}")
}
}
}else{
println(file.absoluteFile)
println("文件不存在")
}
}catch (e:Exception){
e.stackTrace
}
}
操作結果:
config config null
============================================================================
Node的类型为: 3 Node的名字为: #text Node的值为:
Node的子值为: null
Node的类型为: 8 Node的名字为: #comment Node的值为: 我是注释,也能被解析出来 Node的子值为: null
Node的类型为: 3 Node的名字为: #text Node的值为:
Node的子值为: null
Node的类型为: 1 Node的名字为: A Node的值为: null Node的子值为: Apple
Node的类型为: 3 Node的名字为: #text Node的值为:
我是A和B中间的文本
Node的子值为: null
Node的类型为: 1 Node的名字为: B Node的值为: null Node的子值为: Banana
Node的类型为: 3 Node的名字为: #text Node的值为:
Node的子值为: null
tagName: C 节点name: C 节点值: null
launcherInfo子节点的名为:#text 值为:Dog
launcherInfo子节点的名为:#text 值为:elephant
Node的类型为: 3 Node的名字为: #text Node的值为: 我是C和F之间的文本
Node的子值为: null
Node的类型为: 1 Node的名字为: F Node的值为: null Node的子值为: foot
Node的类型为: 3 Node的名字为: #text Node的值为: 我是F和G之间的文本
Node的子值为: null
Node的类型为: 1 Node的名字为: G Node的值为: null Node的子值为: god
Node的类型为: 3 Node的名字为: #text Node的值为:
Node的子值为: null