Android の XmlPullParser および DocumentBuilderFactory に基づく XML 解析レコード

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 オブジェクトを返します。

  1. getParentNode():ノードの親ノードを取得し、Node オブジェクトを返します。

  2. getAttributes():ノードの属性リストを取得し、NamedNodeMap オブジェクトを返します。

  3. hasChildNodes():ノードに子ノードがあるかどうかを判断し、ブール値を返します。

  4. getTextContent():ノードのテキストコンテンツを取得し、文字列を返します。

  5. getFirstChild():ノードの最初の子ノードを取得し、Node オブジェクトを返します。

  6. getLastChild():ノードの最後の子ノードを取得し、Node オブジェクトを返します。

  7. getNextSibling():ノードの次の兄弟ノードを取得し、Node オブジェクトを返します。

  8. 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

分析手順: (サンプルをコピーして再度実行すると、xml ファイルと上記の関数分析と比較することで理解できます)

1. ラベルに値がある場合、ラベルの中央にある値を取得する必要があります。getValue を直接取得することはできませんが、その最初の子ノードの値を取得する必要があります (ラベルとしても理解できます)。この値が取得したい値です(上記の例は理解できましたが、具体的な解析原理はソースコードを見ないと分かりません)と組み合わせることができます。

おすすめ

転載: blog.csdn.net/XJ200012/article/details/131288197